这几天帮人调试程序,遇到boost的锁相关问题。
#include <iostream>
#include <boost/thread/mutex.hpp>
boost::mutex mut;
void bar()
{
boost::mutex::scoped_lock lock(mut);
std::cout << "This is bar!" << std::endl;
}
void foo()
{
boost::mutex::scoped_lock lock(mut);
std::cout << "This is foo!" << std::endl;
bar();
}
这里涉及到锁是否是re-entrant,即可以重入,也就是同一个线程可以进行多次持同一把锁。
一般情况下,锁都不是re-entrant的,重入会导致未定义行为。要解决这个问题,可以采用boost::mutex::recursive_mutex。
#include <iostream>
#include <boost/thread/recursive_mutex.hpp>
boost::recursive_mutex mut;
void bar()
{
boost::recursive_mutex::scoped_lock lock(mut);
std::cout << "This is bar!" << std::endl;
}
void foo()
{
boost::recursive_mutex::scoped_lock lock(mut);
std::cout << "This is foo!" << std::endl;
bar();
}
题外话,因为mutex有lock方法,这里 取名lock对象看起来有点混淆。另外scoped_lock确实挺好用,当然得付出一定的代价。