新闻中心
C++怎么实现一个读写锁_C++并发控制与std::shared_mutex应用
读写锁允许多个读线程并发访问,写线程独占访问,C++17的std::shared_mutex结合std::shared_lock和std::unique_lock可安全高效实现“读多写少”场景的同步。

在多线程编程中,读写锁(Reader-Writer Lock)是一种常见的同步机制,适用于“读多写少”的场景。它允许多个线程同时读取共享资源,但写操作必须独占访问。C++17 起提供了 std::shared_mutex,正好支持这种需求:多个读线程可以共享锁,而写线程需要独占锁。
std::shared_mutex 基本用法
std::shared_mutex 是 C++ 标准库中定义在 <shared_mutex></shared_mutex> 头文件中的类型,支持两种加锁方式:
-
共享锁(shared lock):通过
lock_shared()获取,允许多个线程同时持有,用于读操作。 -
独占锁(exclusive lock):通过
lock()获取,仅允许一个线程持有,用于写操作。
配合 RAII 管理的 std::shared_lock 和 std::unique_lock 使用更安全。
示例代码:
#include <iostream>
#include <thread>
#include <vector>
#include <shared_mutex>
#include <chrono>
std::vector<int> data = {1, 2, 3};
std::shared_mutex rw_mutex;
void reader(int id) {
std::shared_lock<std::shared_mutex> lock(rw_mutex);
std::cout << "Reader " << id << " sees data: ";
for (int d : data) std::cout << d << " ";
std::cout << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟读耗时
}
void writer(int id) {
std::unique_lock<std::shared_mutex> lock(rw_mutex);
data.push_back(id);
std::cout << "Writer " << id << " added " << id << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
// 启动多个读线程和写线程测试
std::vector<std::thread> threads;
for (int i = 0; i < 5; ++i) {
threads.emplace_back(reader, i);
}
for (int i = 10; i < 12; ++i) {
threads.emplace_back(writer, i);
}
for (auto& t : threads) t.join();
读写锁的核心优势
相比普通的互斥锁(std::mutex),读写锁在读频繁的场景下显著提升并发性能:
Remover
几秒钟去除图中不需要的元素
304
查看详情
- 多个读线程可并行执行,不阻塞彼此。
- 写线程独占访问,确保数据一致性。
- 读操作不会阻塞其他读操作,只被写操作阻塞。
这特别适合缓存、配置管理、状态查询等场景。
注意事项与最佳实践
虽然 std::shared_mutex 很实用,但使用时要注意以下几点:
- 避免长时间持有写锁,否则会阻塞所有读操作。
- 注意死锁风险,尤其是嵌套加锁或混合使用不同锁类型时。
- 优先使用
std::shared_lock和std::unique_lock,它们能自动释放锁,防止异常导致的资源泄漏。 - C++14 及以前版本没有
std::shared_mutex,可使用 Boost 库中的boost::shared_mutex替代。
基本上就这些。合理使用 std::shared_mutex 能有效提升多线程程序的吞吐量,尤其在读操作远多于写操作的场景下效果明显。关键是理解共享与独占的区别,并结合 RAII 保证安全。
以上就是C++怎么实现一个读写锁_C++并发控制与std::shared_mutex应用的详细内容,更多请关注其它相关文章!
# 多写
# 公司免费推广网站注册
# 饿了吗店铺营销推广
# 淘宝网站推广共同合作
# 钦州网站建设服务商
# 高效营销策划推广
# 沙井建设网站首页
# seo优化现在的市场
# 馆陶外贸网站优化
# 电商营销推广平台排名榜
# 烟台网络推广营销方案
# 不需要
# 尤其是
# 是一种
# 边缘
# ai
# 加锁
# 死锁
# 游戏开发
# 多线程
# 多个
# red
# 标准库
# 同步机制
# 并发访问
# 区别
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Pandas DataFrame:高效添加条件计算列
J*aScript DOM操作:高效清空列表元素的策略与实践
微信聊天记录怎么加密_微信聊天记录加密方法
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
Django表单提交验证失败后保持字段值不刷新
抖音创作助手登录入口_抖音创作辅助工具官网直达
深入理解J*a链表中的IPosition接口与使用
Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
AO3官方可用镜像 Archive of Our Own网页版最新入口
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
QQ官网正版登录链接 QQ在线登录入口最新
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
使用Pandas转换并合并DataFrame:多列映射至统一结构
在Runstone环境中高效处理TasteDive API的JSON数据
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法
J*aScript中向JSON对象添加新属性的正确姿势
限制HTML日期输入框的日期选择范围
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
css绝对定位元素脱离父容器怎么办_确保父元素position非static
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
Android Studio计算器C键功能异常排查与修复教程
Lar*el Form Request中唯一性验证在更新操作中的正确实现
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
J*aScript中针对特定容器内图片动画的实现教程
微信网页版官方入口教程 微信网页版网页版快速登录步骤
大象笔记网页版入口 印象笔记网页版登录入口
必由学在线入口 必由学网页版快速登录入口
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
Steam官网入口直达 Steam注册及登录步骤
J*aScript类型检查_j*ascript代码规范
html5 app怎么运行环境_配html5 app运行环境【教程】


2025-12-03
浏览次数:次
返回列表