新闻中心

c++中std::shared_mutex(读写锁)的使用_c++多线程读写锁同步实例

2025-11-18
浏览次数:
返回列表
c++kquote>std::shared_mutex支持读写锁机制,允许多个读线程同时访问共享资源,提升读多写少场景下的并发性能。

c++中std::shared_mutex(读写锁)的使用_c++多线程读写锁同步实例

在C++多线程编程中,当多个线程需要访问共享资源时,如果读操作远多于写操作,使用普通的互斥锁(std::mutex)会降低并发性能。因为互斥锁无论读写都独占资源,而实际上多个读操作可以同时进行。这时候就需要用到 std::shared_mutex —— 它支持共享所有权,实现读写锁机制:允许多个线程同时读(共享模式),但写操作必须独占(独占模式)。

std::shared_mutex 简介

std::shared_mutex 是 C++17 引入的标准库组件,定义在头文件 <shared_mutex></shared_mutex> 中。它支持两种加锁方式:

  • 共享锁(shared lock):通过 lock_shared()try_lock_shared() 获取,用于读操作,可被多个线程同时持有。
  • 独占锁(exclusive lock):通过 lock()try_lock() 获取,用于写操作,只能由一个线程持有,且不能与共享锁共存。

对应的,我们通常使用 std::shared_lock 来管理共享锁,用 std::unique_lock 管理独占锁。

多线程读写同步实例

下面是一个典型示例:多个线程对一个共享的整数容器进行读写操作,使用 std::shared_mutex 保证线程安全。

#include <iostream>
#include <vector>
#include <thread>
#include <shared_mutex>
#include <chrono>
#include <numeric>
<p>std::vector<int> data = {1, 2, 3, 4, 5};
std::shared_mutex smtx;  // 共享互斥量</p><p>// 读操作:计算总和
void reader(int id) {
std::shared_lock<std::shared_mutex> lock(smtx);  // 获取共享锁
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟处理时间
int sum = std::accumulate(data.begin(), data.end(), 0);
std::cout << "Reader " << id << " sees sum: " << sum << "\n";
}</p><p>// 写操作:向容器添加一个元素
void writer(int id) {
std::unique_lock<std::shared_mutex> lock(smtx);  // 获取独占锁
std::this_thread::sleep_for(std::chrono::milliseconds(200));
int new_val = id * 10;
data.push_back(new_val);
std::cout << "Writer " << id << " added: " << new_val << "\n";
}</p><p>int main() {
std::vector<std::thread> threads;</p><pre class='brush:php;toolbar:false;'>// 启动3个写线程和5个读线程
for (int i = 0; i < 3; ++i) {
    threads.emplace_back(writer, i + 1);
}
for (int i = 0; i < 5; ++i) {
    threads.emplace_back(reader, i + 1);
}

// 等待所有线程完成
for (auto& t : threads) {
    t.join();
}

return 0;

}

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical

运行结果与分析

输出可能类似:

Reader 1 sees sum: 15
Writer 1 added: 10
Reader 2 sees sum: 25
Reader 3 sees sum: 25
Writer 2 added: 20
Reader 4 sees sum: 35
Reader 5 sees sum: 35
Writer 3 added: 30

可以看到:

  • 多个读线程可以同时执行,它们看到的是加锁时刻的数据状态。
  • 写线程必须等待所有正在进行的读操作完成才能获取锁;同样,读线程也必须等待写操作结束才能开始。
  • 每次写入后,后续读取能看到更新后的数据。

使用建议与注意事项

使用 std::shared_mutex 时注意以下几点:

  • 确保编译器支持 C++17 及以上标准(如 g++ -std=c++17)。
  • 频繁的写操作会使共享锁“饥饿”,即读线程一直无法获得锁,需根据场景评估是否适合。
  • 避免在持有共享锁期间尝试升级为独占锁(C++ 标准不支持自动升级,容易死锁)。
  • 长时间持有共享锁会影响写线程响应速度,应尽量缩短锁的持有时间。

基本上就这些。std::shared_mutex 在读多写少的场景下能显著提升并发效率,是多线程编程中非常实用的同步工具。合理使用 shared_lock 和 unique_lock 配合 shared_mutex,可以让代码更清晰、安全。

以上就是c++++中std::shared_mutex(读写锁)的使用_c++多线程读写锁同步实例的详细内容,更多请关注其它相关文章!


# 尼克  # 哈尔滨网站建设建站  # 漫画怎么发布网站推广作品  # 交城比较好的网站推广  # 乌鲁木齐网站建设企业  # 公司合并关键词排名查询  # 周口seo抖音直播间  # 推广网站建设大概费用  # 福州外贸网站建设报价  # 太原洗发水网站排名优化  # 柳城推荐网络营销推广公司  # 的是  # 加锁  # 有什么区别  # 工具  # 互斥  # 死锁  # 如何实现  # 如何使用  # 多线程  # 多个  # red  # 标准库  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: excel怎么制作工资条 excel快速生成工资条的方法  必由学官方平台入口 必由学在线课堂登录地址  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  美团外卖商家服务中心入口 美团商家版官网入口  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  Lar*el 8 多关键词数据库搜索优化实践  J*aScript中在Map循环中检测并处理空数组元素  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  解决Bootstrap卡片顶部边距导致背景图下移的问题  黑猫投诉统一入口官网 消费者权益保护投诉平台  如何仅使用CSS更改登录界面背景图像图标的颜色  照顾宝贝2小游戏点击立即在线玩  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  铃兰之剑为这和平的世界希里技能组及加点推荐  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  顺丰快递查询系统 官方正版查询入口  steam官方网页快速访问 steam账号注册全流程  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  最新韩小圈网页版登录入口_官网在线观看官方链接  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  Mac怎么查看崩溃日志_Mac控制台错误报告分析  学习通在线学习平台 学习通网页版直接进入课程中心  服务端验证_j*ascript输入检查  动漫岛观看全网网 动漫岛在线正版动漫入口  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  vivo云服务网页版登录 怎么登录vivo云服务网页版  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  在React函数组件中利用原生HTML5进行邮箱地址验证  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  Mac怎么使用表情符号_Mac Emoji快捷键面板  学习通网页版官方登录 超星学习通电脑端入口指南  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  SteamMachine定价或为699美元 大家想入手吗?  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  Typer应用中动态命令行参数的解析与处理  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道 

搜索