boost::lock_guard可以说是一种比boost::unique_lock轻量级的lock, 简单一些场景可以用它就行了。源码如下:
template<typename Mutex>
class lock_guard
{
private:
Mutex& m;
explicit lock_guard(lock_guard&);
lock_guard& operator=(lock_guard&);
public:
explicit lock_guard(Mutex& m_) : m(m_) {
m.lock();
}
lock_guard(Mutex& m_,adopt_lock_t) : m(m_)
{}
~lock_guard() {
m.unlock();
}
}
可以看到只有两个public方法,即构造和析构函数,也就是说,使用boost::lock_guard去guard一个mutex,必然是在boost::lock_guard的对象离开其作用域时unlock它所guard的mutex,不提供提前unlock的功能。
而boost::unique_lock则提供这个功能,除了像boost::lock_guard一样在离开作用域时unlock它guard的mutex外,boost::unique还提供unlock函数,使用者可以手动执行unlock。此外,unique_lock还可以设置超时。
例子如下:
boost::mutex mutex;
void foo( )
{
boost::lock_guard<boost::mutex> lock(mutex);
process(data);
///没有unlock()功能,程序结束自动析构
};