新闻中心
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推出的AI思维导图工具
182
查看详情
运行结果与分析
输出可能类似:
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应用中动态命令行参数的解析与处理
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道


2025-11-18
浏览次数:次
返回列表
个元素
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;