| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 【学习笔记】C++并发与多线程笔记五:unique_lock详解 -> 正文阅读 |
|
[C++知识库]【学习笔记】C++并发与多线程笔记五:unique_lock详解 |
目录一、前言本文接上文 【学习笔记】C++并发与多线程笔记四:互斥量(概念、用法、死锁) 的内容,主要纪录 二、uniqie_lock取代lock_quarduniqie_lock 是个类模板,它的功能跟 lock_quard 类似,但比 lock_quard 更灵活。在工作中,一般用 lock_quard (推荐使用)就足够了,但在一些特殊的场景下会用到 uniqie_lock。 在上篇文章中讲到了 lock_quard 取代了 mutex 的 lock() 和 unlock(),在 lock_quard 的构造函数中上锁,在析构函数中解锁,这点其实在 uniqie_lock 中也是一样的。 uniqie_lock 在使用上比 lock_quard 灵活,但代价就是效率会低一点,并且内存占用量也会相对高一些。 uniqie_lock 的缺省用法实际上与 lock_quard 一样,可以直接替换,代码如下:
三、uniqie_lock的第二个参数uniqie_lock 的第二个参数是一个标志位,其可取参数详见下文。 3.1 std::adopt_lock该标记表示这个互斥锁已经被 lock() 了,uniqie_lock 不会再重复上锁。 也就是说该标记的效果是:假设调用方线程已经拥有了互斥锁的所有权,通知 uniqie_lock 不需要再构造函数中 lock 这个互斥锁了。
3.2 std::try_to_lock假设我们在 myOutMsgObj 线程的回调函数中拿到互斥锁后,sleep 20 秒,就存在一个问题,myOutMsgObj 线程占用了互斥锁资源,却不向下执行,导致另一条线程 myInMsgObj 一直都没办法拿到互斥锁,也要等 20 秒,造成计算资源浪费。
为解决这个问题,uniqie_lock 引入了 try_to_lock 参数,它表示代码会尝试上锁,即使没有成功,也会立即返回,不会阻塞的等待。
3.3 std::defer_lock该标记表示并没有给 mutex 加锁,即初始化了一个没有加锁的 mutex。使用该标记初始化的 uniqie_lock 对象可以灵活的调用 uniqie_lock 的成员函数,这点将在下文中一起演示。 四、uniqie_lock的成员函数4.1 lock()使用
4.2 unlock()根据 4.1 的代码,我们可以知道 unique_lock 的成员函数 lock() 上锁后,在对象析构的时候会自动解锁,那为什么 unique_lock 还需要提供 unlock() 函数呢? 这里就体现了 unique_lock 的灵活性,它既具备智能指针自动销毁的特性,又可以在代码中手动解锁,方便程序在一段代码中对其中某几个部分上锁的需求,将一些非共享代码从锁中提取出来,从而提高效率。
4.3 try_lock()这个成员函数与
4.4 release()该成员函数的作用是返回它所管理的 mutex 对象指针,并释放所有权;也就是说,这个 unique_lock 和 mutex 不再有关系。 调用以下代码创建 unique_lock 类型的对象 m_guard1 时,实际上是把 m_guard1 与 m_mutex1 对象绑定在一起了,release() 函数可以将这两个对象解绑,并返回绑定的 mutex 指针,即此处的 m_mutex1 。注意这里是解绑,并不是销毁。
调用 release() 函数解绑后,我们必须保存返回的 mutex 指针,并在接下来的代码中自行管理。
五、uniqie_lock所有权的传递当 uniqie_lock 与 mutex 对象绑定在一起才是一个完整的、能发挥作用的 uniqie_lock 实例,也就是说 uniqie_lock 需要和 mutex 配合使用,可以理解为 uniqie_lock 需要管理一个 mutex。 一个 mutex 对象只能被一个 uniqie_lock 对象所有(拥有),即同一个 mutex 无法被两个 uniqie_lock 对象同时使用,这就是 uniqie_lock 的所有权概念。
m_guard1 拥有 m_mutex1 的所有权,并且 m_guard1 可以把自己 mutex(m_mutex1) 的所有权转移给其他的 uniqie_lock 对象。
将 m_guard1 的所有权转移给 m_guard2,代码如下:
转移unique_lock所有权的扩展方法:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:30:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |