IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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++ 标准库 mutex condition variable lock 辨析及读写锁编写 互斥锁条件变量锁辨析互斥锁条件变量区别 -> 正文阅读

[C++知识库]C++ 标准库 mutex condition variable lock 辨析及读写锁编写 互斥锁条件变量锁辨析互斥锁条件变量区别

本文仅是笔记快速记录一下

内核的自旋锁和睡眠锁

先复习这个:

从自旋锁、睡眠锁、读写锁到 Linux RCU 机制讲解_我说我谁呢 --CSDN博客

然后看一下这个(引用)

linux spin_lock(自旋锁)semaphore(信号量)和mutex(互斥锁)的区别_D_Guco的专栏-CSDN博客


mutex condition_variable lock概念

先区分一下 lock,mutex,ca 的概念,特别是 lock 是作为 mutex 的 RAII 实现这一点是 C++ 学习目的。

C++ 文档看这几个:std::mutex - cppreference.comstd::condition_variable - cppreference.com

先是 std::mutex 的语义,mutex 的实现即一个 while CAS 而已(synchronization primitive),但是我们知道(上面的文章也有源码分析)实际由于 futex 的存在,mutex 本身也是实现了 process block 的!

而 condition variable 也不一定就算 sleeplock,实际上他可能只是一种支持 notify 的语义实现而已,他有可能通过一种轮询来实现 wakeup 也说不准,但是起码他不会来到上层来拿到锁之后再判断是不是需要马上释放然后重新轮询上层的锁,不过这里的确和 mutex 一样能 sleep(而且就像 吗 sleeplock 那样需要一个基本的无 notify 功能的锁)。。

所以明确的区分 mutex 和 cv 是不能单用是否 sleep 节省 polling 来区分的!

比较好的区分方法:

Right. A mutex only allows you to wait until the lock is available; a condition variable allows you to wait until some application-defined condition has changed.

src: multithreading - Advantages of using condition variables over mutex - Stack Overflow

回想我们之前 xv6 的 sleeplock 的实现,他的调用 sleep syscall 时 cond 是 sleep 在 sleeplock 结构体上的!所以本质上只是一个很 infrastructural 的 带 suspend 进程的 mutex 实现,并不是我们的 condition variable 的语义。


用 mutex 和 condition variable 做读写锁

然后我们复习(复读)Rwlock 的实现以 C++(标准并发读者写者模型属于):

但是这里的 rwlock 本身的 lock 状态是 implicit 的,主要是用 writer_entered + reader_count 记录写者状态,用 reader_count 记录读者状态, 他的 meta 信息控制才是 explicit 的。

然后看 unlock 的过程,这里无非是 notify 的调用而已。

附涉及的变量:

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-23 11:16:20  更:2021-09-23 11:17:01 
 
开发: 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 22:24:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码