码迷,mamicode.com
首页 > 其他好文 > 详细

unique_lock 类模板

时间:2020-06-25 19:20:00      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:std   复制   成员函数   code   函数返回值   strong   调用   转移   使用   

一、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 类模板

标签:std   复制   成员函数   code   函数返回值   strong   调用   转移   使用   

原文地址:https://www.cnblogs.com/zhiminzeng/p/13192465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!