1、unique_lock概念
unique_lock是一个类模板,工作中一般使用lock_guard(推荐使用)。
unique_lock比lock_guard灵活,但效率差一些,内存消耗也多一些。一般用法:
std::mutex my_mutex; //............... std::unique_lock(std::mutex) sbguard(my_mutex);
讯享网
2、unique_lock参数
(1)std::adpot_lock
前提:在此之前要先加lock。
表示互斥量已经被lock,无需再lock(如果使用这个参数,而互斥量在此之前没有被lock,那么会报异常)。
讯享网std::mutex my_mutex; //............... my_mutex.lock(); //必须要先lock,否则报异常 std::unique_lock(std::mutex) sbguard(my_mutex, std::adpot_lock);
(2)std::try_to_lock
前提:不能在此之前加锁,否则卡死。
尝试加锁,如果无法锁住,则做其他事情,不会一直等待其他线程释放锁。
std::mutex my_mutex; //.............. std::unique_lock(std::mutex) sbguard(my_mutex, std::try_to_lock); if(sbguard.owns_lock()) {
//表示拿到锁 } else {
//拿不到锁,做其他事情 }
//延迟函数
std::chrono::milliseconds dura(2000); // 2秒
std::this_thread::sleep_for(dura); //sleep2秒
(3)std::defer_lock
前提:不能在此之前加锁,否则卡死。
并没给mutex加锁,而是初始化了一个没有加锁的mutex。
讯享网std::mutex my_mutex; //.............. std::unique_lock(std::mutex) sbguard(my_mutex, std::defer_lock); sbguard.lock();
3、unique_lock成员变量
std::mutex my_mutex; //.............. std::unique_lock(std::mutex) sbguard(my_mutex, std::defer_lock);
(1)lock()–加锁:sbguard.lock();
(2)unlock()–解锁:sbguard.unlock();
为什么自动可以unlock,还需要unlock( ) ?
lock的代码越少,效率越高。把锁住代码的多少,也成为锁的粒度,粒度一般用粗细表示。
一段代码中,有共享数据,也有非共享数据,在共享数据可以lock,到非共享数据的时候可以unlock。
(3)try_lock()–尝试加锁
讯享网sbguard.try_lock( ); //锁住返回true,否则返回false ,拿到锁做一些共享代码,拿不到做些其他事情。
(4)release()– 返回它所管理的mutex对象指针,并释放所有权,unique_lock与mutex不再有关系
std::unique_lock(std::mutex) sbguard(my_mutex, std::defer_lock); std::mutex *ptr = my_mutex.release(); //................. ptr->unlock(); //需要负责unlock
4、unique_lock所有权转移mutex
讯享网std::mutex my_mutex; //.............. std::unique_lock(std::mutex) sbguard(my_mutex);
sbguard可以把自己对my_mutex的所有权转移给其他的unique_lock对象。
可以转移,但是不能复制。
方式1:
std::mutex my_mutex; //.............. std::unique_lock(std::mutex) sbguard1(my_mutex); std::unique_lock(std::mutex) sbguard2(std::move(sbguard1));
方式2:
讯享网std::unique_lock<std::mutex> rtn_unique_lock() {
std::unique_lock<std::mutex> tmpguard(my_mutex); //从函数返回一个局部的unique_lock是可以的 //返回这种局部对象unique_lock会导致系统生成临时unique_lock对象,并调用unique_lock的移动构造函数。 return tmpguard; } //............ std::unique_lock<std::mutex> guard1 = rtn_unique_lock();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/95560.html