unique_lock 类模板
Posted zhiminzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unique_lock 类模板相关的知识,希望对你有一定的参考价值。
一、unique_lock 的第二个参数
(1)std::adopt_lock
unique_lock对象在构造的时候,不执行mutex::lock()
所以必须要把互斥量提前 lock(),该参数与 lock_guard 使用相同
m_mutex1.lock(); // 使用adopt_lock 之前互斥量先要被锁住 std::unique_lock<std::mutex> myLockGuard(m_mutex1, std::adopt_lock);
(2)std::try_to_lock
会去尝试用mutex的lock() 去锁定这个metux,但是如果没有锁定成功,会立即返回,不会阻塞在那
其优点是没拿到锁时,线程不会一直卡在那
// 用try_to_lock 前提是自己不能先去lock std::unique_lock<std::mutex> myLockGuard(m_mutex1, std::try_to_lock); if (myLockGuard.owns_lock()) { // 如果拿到了锁,做拿到锁之后需要处理的事情 }
(3)std::defer_lock
使用的前提,不能自己先lock,否则会报异常
// m_mutex1 再此之前不能自己lock。 // 把 myLockGuard 和 m_mutex1 绑定在一起 std::unique_lock<std::mutex> myLockGuard(m_mutex1, std::defer_lock);
二、unique_lock 的成员函数
std::unique_lock<std::mutex> myLockGuard(m_mutex1, std::defer_lock);
myLockGuard.lock(); // unique_lock 析构的时候自己能够unlock() myLockGuard.unlock(); // 可以用于自己临时解开,去处理一些非共享数据 myLockGuard.try_lock(); // 拿到锁返回true,没拿到锁返回false,这个函数不会阻塞 myLockGuard.release(); // 返回它所管理的mutex对象指针,并释放所有权, // 之后 m_mutex 和 unique_lock 没有关系 // 如果原来mutex 对象处于加锁状态,则需要自己接管过来并负责解锁
std::unique_lock<std::mutex> myLockGuard(m_mutex1); mutex* pmutex = myLockGuard.release(); // 返回mutex 指针 pmutex->unlock(); // 需要自己负责解锁
三、unique_lock 所有权传递
std::unique_lock<std::mutex> myLockGuard(m_mutex1); // myLockGuard 拥有 m_mutex1 的所有权 // myLockGuard 可以把自己对m_mutex1 的所有权,转移给其他unique_lock 对象, // unique_lock 对m_mutex1 的所有权,可以转移,但是不能复制 std::unique_lock<std::mutex> myLockGuard2(myLockGuard); // 非法复制,编译报错 std::unique_lock<std::mutex> myLockGuard2(std::move(myLockGuard)); // 转移所有权 // 转移所有权之后,myLockGuard 指向空,myLockGuard2 指向 m_mutex1
// 也可以函数返回值为 std::unique_lock<std::mutex> 来转移所有权 // 函数中的临时变量,在 return 的时候会调用移动构造函数转移所有权
以上是关于unique_lock 类模板的主要内容,如果未能解决你的问题,请参考以下文章