unique_lock

unique_lock是管理具有唯一所有权的互斥对象的对象。类似智能指针unique_ptr。在构造时(或通过移动分配给它),对象获得一个互斥对象,负责该对象的锁定和解锁操作。该对象支持两种状态:锁定和解锁。此类保证在销毁时将管理的互斥对象解锁(即使未显式调用解锁函数)。因此,它能够保证互斥对象在抛出异常的情况下正确解锁,克服了mutex使用中的缺点。但是,unique_lock对象不以任何方式管理互斥对象的生命周期:这要求互斥对象的持续时间应至少延长到管理它的unique_lock销毁。

unique_lock是一个模板类,需要使用Mutex类型作为模板参数。

  • try_lock初始化: 新创建的unique_lock对象管理Mutex对象m,并尝试调用m.lock()Mutex对象进行上锁,如果此时另外某个unique_lock对象已经管理了该Mutex对象m,则当前线程将会被阻塞。

  • try-locking初始化: 新创建的unique_lock对象管理Mutex对象m,并尝试调用m.try_lock()对Mutex对象进行上锁,但如果上锁不成功,并不会阻塞当前线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
boost::mutex mut;

void bar()
{
boost::unique_lock<boost::mutex> lock(mut);
std::cout << "This is bar!" << std::endl;

if( lock.owns_lock() )
cout << "owns lock" << endl;
else
lock.lock();
}

void foo()
{
boost::unique_lock<boost::mutex> lock(mut);
std::cout << "This is foo!" << std::endl;
}