0

0

C++中std::shared_mutex怎么实现读写锁_C++17并发编程优化【同步】

尼克

尼克

发布时间:2026-02-15 13:29:02

|

155人浏览过

|

来源于php中文网

原创

std::shared_mutex是c++17读写锁,依赖os原生支持(pthread_rwlock_t或srwlock),需启用_cxx17且平台满足要求;必须配合shared_lock(读)或unique_lock(写)使用,不支持lock_guard;存在写饥饿、无写优先策略、跨平台兼容性差等问题,仅在读多写少且临界区长时具优势。

c++中std::shared_mutex怎么实现读写锁_c++17并发编程优化【同步】

std::shared_mutex 是 C++17 引入的读写锁,但不能直接用于 Windows XP 或旧 MSVC 工具集

它在 Linux(glibc ≥ 2.26)和较新 Windows(Visual Studio 2015 Update 3 起,需 _HAS_CXX17 启用)上可用,但底层依赖 OS 原生支持:pthread_rwlock_t(Linux)或 SRWLOCK(Windows Vista+)。若目标平台不满足,编译会失败或退化为互斥模拟——此时性能反而更差。

  • 检查是否启用 C++17:MSVC 需定义 _HAS_CXX17=1,Clang/GCC 需 -std=c++17
  • Windows 上若链接到旧 CRT(如 /MDd 对应 debug 版旧库),std::shared_mutex 构造可能抛出 std::system_error,错误码为 not_supported
  • 不要假设它“一定比 std::mutex 快”——读多写少且临界区长时才体现优势;写操作仍会阻塞所有读,且内部有额外原子开销

正确使用 shared_lock 和 unique_lock 配合 shared_mutex

std::shared_mutex 本身不提供 lock/unlock 接口,必须搭配 std::shared_lock(共享)或 std::unique_lock(独占)使用。混用或漏写会导致未定义行为,比如用 std::lock_guard 包裹 std::shared_mutex 会编译失败。

  • 读操作:用 std::shared_lock<:shared_mutex></:shared_mutex>,支持延迟构造、可移动、可 try_lock_for
  • 写操作:只能用 std::unique_lock<:shared_mutex></:shared_mutex>std::lock_guard 不支持(无 lock() 成员)
  • 禁止跨作用域传递锁对象:shared_lock 移动后原对象变为未持有状态,再次 unlock 会抛异常
std::shared_mutex rwmtx;
std::vector<int> data;
<p>// 读
void read() {
std::shared_lock<std::shared_mutex> lock(rwmtx); // 自动 RAII
for (int x : data) { /<em> ... </em>/ }
}</p><p>// 写
void write(int x) {
std::unique_lock<std::shared_mutex> lock(rwmtx);
data.push_back(x);
}

shared_mutex 的饥饿问题与写优先策略缺失

std::shared_mutex 标准未规定调度策略,实际实现多为“读优先”,即持续有读请求时,写线程可能无限等待(写饥饿)。它也不提供类似 std::shared_timed_mutextry_lock_shared_for 之外的超时写锁接口,无法主动破除饥饿。

上班人导航
上班人导航

上班人必备的职场办公导航网站

下载
  • 无法通过标准接口设置写优先;若业务要求强一致性(如配置热更新),需自行加计数器或信号量控制写请求准入
  • 避免在循环中反复获取 shared_lock,尤其配合 long-running 读操作——这会显著延长写等待时间
  • 调试时注意:GDB/Lldb 可能无法准确显示 shared_mutex 当前持有者数量,需靠日志或自定义 wrapper 统计

替代方案:何时该放弃 shared_mutex 改用其他同步机制

当出现频繁写、数据结构简单、或需跨平台兼容旧系统时,std::shared_mutex 往往不是最优解。它的优势只在明确的“高并发读 + 低频写 + 大临界区”场景下成立。

立即学习C++免费学习笔记(深入)”;

  • 写占比 > 15%:直接用 std::mutex 更轻量,避免共享锁的原子计数开销
  • 需要乐观读(如 RCU 风格):考虑 std::atomic<t></t> + hazard pointer,或 absl::ReaderMutex(如果允许引入第三方)
  • 需细粒度控制(如分段锁):用 std::array<:shared_mutex n></:shared_mutex> 分片保护容器,比单个锁扩展性更好

真正难的从来不是选对锁类型,而是识别出“这里其实根本不需要锁”——比如用无锁队列、copy-on-write vector 或只读快照,往往比调优 shared_mutex 更有效。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

541

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

26

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

38

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1441

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

362

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2217

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

37

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

673

2023.08.10

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.5万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号