当前位置: 首页 > news >正文

c++ shared_mutex 读写锁使用详解

c++ 读写锁使用详解

std::shared_mutex c++17

  • 头文件 #include <shared_mutex>
  • 用于实现共享和独占访问的互斥锁。
  • 提供了一种更加灵活的机制,允许多个线程在共享模式下读取数据,但只允许单个线程在独占模式下写入或修改数据。
  • 与 std::mutex 相比,具有以下额外特性:
    • 多个线程可以同时以共享模式(shared mode)持有锁,允许并发读取操作。
    • 只有一个线程可以以独占模式(exclusive mode)持有锁,允许写入或修改操作。
    • 当一个线程以独占模式持有锁时,其他线程无法以共享模式持有锁,它们必须等待独占模式的线程释放锁。
    • 当一个线程以共享模式持有锁时,其他线程可以以共享模式持有锁,允许并发读取操作。

成员函数

  • lock:锁定互斥,若互斥不可用则阻塞。
  • try_lock:尝试锁定互斥,若互斥不可用则返回。
  • unlock:解锁互斥。
  • lock_shared:以共享模式锁定互斥,若互斥不可用则阻塞。
  • try_lock_shared:尝试以共享模式锁定互斥,若互斥不可用则返回。
  • unlock_shared:解锁以共享模式锁定的互斥。

推荐使用方法

  • 当使用共享模式时,配合 std::shared_lock 使用。
  • 当使用独占模式时,配合 std::lock_guard,std::unique_lock 或者 std::scoped_lock 使用。

示例代码

  • 以下示例演示了两个读取线程(reader)以共享模式持有 mutex,并同时读取 shared_data 的值。写入线程(writer)以独占模式持有 mutex,并将 shared_data 的值加一。读取线程可以同时持有锁,而写入线程需要等待读取线程释放锁。

    #include <cstdio>
    #include <thread>
    #include <mutex>
    #include <shared_mutex>std::shared_mutex mutex;
    int shared_data = 0;void reader()
    {std::shared_lock lock(mutex);printf("reader: shared data value is %d\n", shared_data);
    }void writer()
    {std::lock_guard lock(mutex);shared_data += 1;printf("writer: incremented shared data value to %d\n", shared_data);
    }int main()
    {std::jthread t1(reader);std::jthread t2(writer);std::jthread t3(reader);return 0;
    }
    
http://www.lryc.cn/news/230614.html

相关文章:

  • 淘宝商品详情接口,淘宝详情页接口,宝贝详情页接口,商品属性接口,商品信息查询,商品详细信息接口,h5详情,淘宝API接口演示案例
  • python爬取网站数据,作为后端数据
  • 【机器学习】K近邻算法:原理、实例应用(红酒分类预测)
  • 基于安卓android微信小程序的快递取件及上门服务系统
  • leetCode 92.反转链表 II + 图解
  • 【MongoDB】索引 – 通配符索引
  • python安装pip install报错Could not fetch URL https://pypi.org/simple/pip/...更换镜像源
  • C++ 算数运算符 学习资料
  • 问题 H: 棋盘游戏(二分图变式)
  • SQL 主从数据库实时备份
  • C/C++:在#define中使用参数
  • Hive 查询优化
  • 【Java 进阶篇】JQuery 案例:优雅的隔行换色
  • Redis 常用的类型和 API
  • 在qt的设计师界面没有QVTKOpenGLWidget这个类,只有QOpenGLWidget,那么我们如何得到QVTKOpenGLWidget呢?
  • 力扣每日一道系列 --- LeetCode 138. 随机链表的复制
  • 无人零售:创新优势与广阔前景
  • 【华为OD题库-022】阿里巴巴找黄金宝箱(IV)-java
  • Linux 图形界面配置RAID
  • (脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别)、( 什么是qps,tps,并发量,pv,uv)、(什么是接口幂等性问题,如何解决?)
  • 安全通信网络(设备和技术注解)
  • 深度学习_12_softmax_图片识别优化版代码
  • element-ui设置下拉选择切换必填和非必填
  • Linux的命令——关于操作用户及用户组的命令
  • pycharm 设置多级跳转SSH
  • LeetCode 189.轮转数组(三种方法解决)
  • GB28181设备对接视频流的流程
  • 类属性修改(为什么python类不具备被赋值能力?)
  • uniapp App端 解决input@input事件动态修改值不生效的问题
  • ELK分布式日志