细谈lock_guard与shared_lock与unique_lock的区别

2023-11-04

C++互斥锁(互斥量)封装在Mutex类中,每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。同一时刻,只能有一个线程持有该锁。
在这里插入图片描述
互斥锁通过调用类成员函数lock()与unlock()来实现加锁和解锁操作。
读写锁也叫做“共享-独占锁”,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。当读写锁处于写加锁状态时,在其解锁之前,所有尝试对其加锁的线程都会被阻塞;
当读写锁处于读加锁状态时,所有试图以读模式对其加锁的线程都可以得到访问权,但是如果想以写模式对其加锁,线程将阻塞。
1、lock_guard:
(1)创建即加锁,作用域结束自动析构解锁,无需手工解锁。
(2)且不能中途解锁,必须等作用域结束才能解锁。
(3)缺点在于在定义lock_guard的地方会调用构造函数加锁,在离开定义域时lock_guard就会被销毁,调用析构函数解锁。如果定义域范围很大的话,锁的粒度就会很大,影响效率。
2、unique_lock
当一个函数内部有两段代码需要保护时,这个时候使用lock_guard就需要创建两个局部对象来管理一个同斥锁,修改方法是使用unique_lock,它提供lock()和unlock()接口,能记录现在是处于上锁还是未上锁状态。
std::unique_lock<std:mutex>guard(_mu);
guard.unlock();//临时解锁
guard.lock(); //临时上锁
而unique_lock在析构的时候会判断当前锁的状态来决定是否解锁,如果已经是解锁状态了,就不会再次解锁了,效率较慢。unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。
3、shared_lock可用于保护共享数据不被多个线程同时访问。std::shared_lock::lock
以共享模式锁定关联互斥。等效于调用 mutex.lock_shared();用于获得互斥的共享所有权。若另一线程以排他性所有权保有互斥,则到 lock_shared 的调用将阻塞执行,直到能取得共享所有权。shared_lock是read lock。被锁后仍允许其他线程执行同样被shared_lock的代码。这是一般做读操作时的需要。
4、std:adopt_lock称为自适应锁,用于判断。表示可传递给lock_guard和unique_lock的构造函数,假设调用一方已经lock成功了,则通知lock_guard不需要再构造函数中lock这个互斥量了(就是不需要再锁了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

细谈lock_guard与shared_lock与unique_lock的区别 的相关文章

随机推荐

  • 如何在数据库事务提交成功后进行异步操作

    问题 业务场景 业务需求上经常会有一些边缘操作 比如主流程操作A 用户报名课程操作入库 边缘操作B 发送邮件或短信通知 业务要求 操作A操作数据库失败后 事务回滚 那么操作B不能执行 操作A执行成功后 操作B也必须执行成功 如何实现 普通的
  • AFL++ (PlusPlus) 介绍与实践

    文章目录 一 AFL 简介 缝合块 AFL基础款 1 基于覆盖率指标的反馈 2 变异 3 fork 服务器 基于智能调度的加强版 1 AFLFast 2 MOpt 基于绕过障碍的加强版 1 LAF Intel https lafintel
  • R语言作图——histogram(直方图)

    原创 黄小仙 最近小仙同学很是烦恼 本以为自己已经掌握了ggplot2作图的语法 用read csv ggplot geom point boxplot violinplot 就可以画遍天下图表 结果却发现到真正画图的时候 还是会出现不少的
  • 001-取整函数(ceil、floor、round)

    取整函数 ceil floor round 1 ceil 向上取整 2 floor 向下取整 3 round 四舍五入 4 拓展 取整函数主要有三种 ceil floor round 1 ceil 向上取整 函数名 ceil 用 法 dou
  • oracle 字符串等于,ORACLE中字符串是否相等的比较

    在ORACLE中 将空字符串视为NULL 任何值与NULL比较结果都为NULL 如此一来 在比较两个字符串的时候就会出现意外 请看以下的例子 DECLARE i VARCHAR2 10 NULL v VARCHAR2 10 ABC BEGI
  • 如何谈不分手的恋爱?

    如何区分想要和爱 成功的事业易得 幸福的婚姻难求 事业的成功归结于自己 失败的婚姻归结于对方 先要从自己承担责任 分清爱和需求 需求 需要need 想要want 口渴的时候想喝水 需要 口渴的时候想喝可乐 想要 什么是爱 爱是满足了自我需要
  • IDEA 2020.2下载插件失败或速度慢的解决方法

    IDEA 2020 2下载插件失败或速度慢的解决方法 之前看了有帖子说 取消勾选设置里的Use secure connection即可访问插件 https blog csdn net linzhiqqq article details 82
  • 量化交易领域最缺的人才!

    在量化交易领域 研究和开发是行业存在的基础 已经有人做了大量工作来回答一些尚未解决的问题 在投资银行和对冲基金的语音交易平台上 你会发现交易者 结构者和开发量化模型的量化 对复杂的单纯期权和奇异衍生品合约交易 定价并进行风险管理 90年代衍
  • 使用git将本地项目上传至git仓库

    介绍 一般来说开发过程中都是先在git创建远程仓库 然后fetch到本地仓库 再进行commit push等操作 但是有时候也需要将本地已经开发的项目上传至一个空的远程仓库中 期间也是遇到不少问题 特此总结一下 初始化本地仓库 初始化仓库
  • 卷积神经网络提取特征值

    网上太杂乱了 所以把看到的很值得学习的记录下 https www cnblogs com CV life p 10116275 html
  • Linux运维工程师面试题集锦

    Linux运维工程师面试题集锦 一 Linux基础问题 1 1 Linux的几个常用命令有哪些 1 2 Linux如何查看当前系统版本 1 3 Linux系统的文件权限有哪些 1 4 Linux如何修改文件权限 1 5 如何在Linux系统
  • Python机器学习:concat()合并训练集和测试集

    如果训练集和测试集分开 要合并放在一起进行特征工程 axis的意思是 轴 决定了两个数据集是纵向的合并 还是横向的合并 axis 0是纵向的合并 把很多行合并在一起 由于默认是纵向的合并 axis 0写不写都可以 axis 1是横向的合并
  • 大学计算机基础课都学什么,大学计算机基础课程

    编者按 在全球范围信息化浪潮下 良好的信息素养成为社会对信息化人才的必然要求 与之相适应的 中小学信息技术教育规划目标逐年提高 专业领域对人才的信息实践能力更加严格 信息应用技术与学习 科研和社会发展的结合日益紧密 而作为培养学生信息素养的
  • 掌握shell编程中的细节:轻松应对可能出现的考点(重定向篇)

    前言 本来想写成某一系列的文章 发现以前写过 就直接粘贴以前的链接了 因为没有什么新内容 这个算是比较常用的命令了 这种就是也许会用并常用 知道什么场景用什么 但是也许忽略或者平时不在乎每个具体定义怎么说的那种命令 常见的问题 linux系
  • Socks5代理:跨界电商出海与爬虫应用的智能助手

    一 Socks5代理与跨界电商 突破地理限制 跨界电商需要面对不同国家和地区的市场 部分市场可能存在地理封锁 Socks5代理能够绕过地理封锁 实现无障碍的访问 帮助企业开展全球化业务 保护数据隐私 在跨界电商过程中 大量的敏感数据需要传输
  • 三、核心配置文件详解

    三 核心配置文件详解 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息 配置文档的顶层结构如下 configuration 配置 properties 属性 settings 设置 typeAliases 类
  • Nvidia Tesla和Quadro、GeForce的区别

    近年来 关于使用GPU协同CPU进行大规模高性能并行计算的做法引起了业界的广泛关注 特别是从去年以来 NVIDIA公司在全球推出了基于 CPU GPU 混合架构的Tesla高性能计算系统 并推出了基于CUDA架构的软件编程环境 那么 Tes
  • 生物酶用计算机算法表示,新型生物酶的挖掘算法研究

    摘要 卤醇脱卤酶是一类重要的蛋白质 它不仅能通过开环反应催化有毒污染物的降解 还能作为亲核试剂促进高价值药物中间体的生成 卤醇脱卤酶在自然界中的分布极为稀少 目前仅在少数菌株中发现过卤醇脱卤酶酶活性的表达 已有的生成卤醇脱卤酶的生物实验虽然
  • Vision Transformer (ViT)

    文章目录 Vision Transformer ViT 1 回顾Transformer TRM 2 ViT 2 1 输入处理 2 2 patch embedding 结构图的2 2 3 CLS 和位置编码 结构图的3 2 4 Encoder
  • 细谈lock_guard与shared_lock与unique_lock的区别

    C 互斥锁 互斥量 封装在Mutex类中 每个线程在对资源操作前都尝试先加锁 成功加锁才能操作 操作结束解锁 同一时刻 只能有一个线程持有该锁 互斥锁通过调用类成员函数lock 与unlock 来实现加锁和解锁操作 读写锁也叫做 共享 独占