unique_lock取代lock_guard
unique_lock的第二个参数
- std::adopt_lock,表示互斥量已经lock了。要先lock()才能使用这个参数。
- std::try_to_lock,尝试lock互斥量,如果lock失败会立即返回。并不会阻塞。使用owns_lock()判断是否lock成功。
- std::defer_lock,不能先lock,否则会报异常。初始化了一个没有加锁的互斥量。配合成员函数[1],[2],[3]使用。
unique_lock的成员函数
- lock(),在传入defer_lock后,使用lock()加锁,不用调用unlock,自动解锁。
- unlock(),手动解锁。
- try_lock(),返回bool值。不会阻塞。
- release(),返回管理的mutex指针,并释放所有权。已经加锁的互斥量需要自己负责解锁。
unique_lock所有权的传递
- 对互斥量的所有权可以转移(move语义)不能复制。
- 作为函数返回值。系统默认调用移动构造函数。
std::unique_lock<mutex> rtn_unique_lock()
{
std::unique_lock<mutex> tmGuard(mutex1);
return tmGuard;
}