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 类模板的主要内容,如果未能解决你的问题,请参考以下文章

boost-同步-锁的类型

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

boost::thread类内成员函数调用返回unique_lock实例化错误