新闻中心
C++怎么实现一个读写锁_C++并发编程与读写锁实现
答案是使用std::shared_mutex实现读写锁,允许多个读线程共享访问、写线程独占访问,提升读多写少场景的并发性能;C++17中通过lock_shared()和lock()分别获取读锁和写锁,配合std::shared_lock和std::unique_lock实现RAII管理,避免资源泄漏;若兼容C++11,则可用mutex与condition_variable手动实现读写状态控制,确保读时不写、写时互斥。

在C++中实现读写锁(Reader-Writer Lock),核心目标是允许多个读线程同时访问共享资源,但写线程独占访问。这种机制适用于“读多写少”的场景,能显著提升并发性能。
使用标准库的 shared_mutex 实现读写锁
C++17 起提供了 std::shared_mutex,天然支持读写锁语义:
- 共享所有权(读锁):多个线程可同时获得共享锁(.lock_shared())
-
独占所有权(写锁):仅一个线
程可获得独占锁(.lock())
#include <shared_mutex><br>#include <thread><br>#include <vector><br>#include <iostream><br><br>std::shared_mutex rw_mutex;<br>int data = 0;<br><br>void reader(int id) {<br> rw_mutex.lock_shared();<br> std::cout << "Reader " << id << " reads data: " << data << "\n";<br> rw_mutex.unlock_shared();<br>}<br><br>void writer(int id) {<br> rw_mutex.lock();<br> data += id;<br> std::cout << "Writer " << id << " writes data: " << data << "\n";<br> rw_mutex.unlock();<br>}<br><br>int main() {<br> std::vector<std::thread> threads;<br> for (int i = 0; i < 3; ++i) {<br> threads.emplace_back(reader, i);<br> }<br> threads.emplace_back(writer, 10);<br> threads.emplace_back(reader, 99);<br><br> for (auto& t : threads) t.join();<br> return 0;<br>}
输出中,多个读线程可能同时执行,而写线程会阻塞所有读操作。
手动实现简易读写锁(C++11 兼容)
若不能使用 C++17,可用互斥量和条件变量模拟读写锁逻辑。
基本思路:
Zyro AI Background Remover
Zyro推出的AI图片背景移除工具
145
查看详情
- 用 std::mutex 保护读写状态
- 用 std::condition_variable 协调读写线程
- 维护当前活跃读线程数和是否正在写
class ReadWriteLock {<br>private:<br> std::mutex mtx;<br> std::condition_variable cv;<br> int readers{0};<br> bool writing{false};<br><br>public:<br> void lock_read() {<br> std::unique_lock<std::mutex> lock(mtx);<br> cv.wait(lock, [this] { return !writing; });<br> readers++;<br> }<br><br> void unlock_read() {<br> std::lock_guard<std::mutex> lock(mtx);<br> readers--;<br> if (readers == 0) cv.notify_all();<br> }<br><br> void lock_write() {<br> std::unique_lock<std::mutex> lock(mtx);<br> cv.wait(lock, [this] { return !writing && readers == 0; });<br> writing = true;<br> }<br><br> void unlock_write() {<br> std::lock_guard<std::mutex> lock(mtx);<br> writing = false;<br> cv.notify_all();<br> }<br>};
使用时需注意避免死锁,比如不要在持有读锁时尝试获取写锁。
RAII 封装提升安全性
为避免忘记解锁,应使用 RAII 包装器:
- std::shared_lock<:shared_mutex>:管理共享锁(读)
- std::unique_lock<:shared_mutex>:管理独占锁(写)
std::shared_mutex rw_mutex;<br><br>void safe_read() {<br> std::shared_lock lock(rw_mutex);<br> // 自动加共享锁,作用域结束自动释放<br> std::cout << "Reading: " << data << "\n";<br>}<br><br>void safe_write(int val) {<br> std::unique_lock lock(rw_mutex);<br> data = val;<br>}
RAII 是 C++ 并发编程的最佳实践,极大降低资源管理错误风险。
基本上就这些。优先使用 std::shared_mutex + std::shared_lock/unique_lock,简洁高效。若需兼容旧标准,可手写基于 condition_variable 的版本,但务必测试竞争边界情况。
以上就是C++怎么实现一个读写锁_C++并发编程与读写锁实现的详细内容,更多请关注其它相关文章!
# c++
# 可以做淘宝推广的网站吗
# 微信群营销引流推广文案
# 任丘网站推广怎么收费
# 唐山建设外贸网站
# 初学seo的文章
# 专业网站建设主要问题
# 工程手机网站建设
# 广州网站优化哪家快
# 园区品牌营销推广
# 解决问题
# 中文网
# 相关文章
# 适用于
# 互斥
# 边缘
# 多写
# 死锁
# 游戏开发
# 多个
# red
# 标准库
# 作用域
# 并发编程
# stream
# ios
# ai
# 河南品质网站推广服务
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
J*aScript中针对特定容器内图片动画的实现教程
星露谷物语官网入口 星露谷物语游戏官网入口
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
解决Flask中Quill编辑器内容提交失败及TypeError的指南
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
学习通网页版快速入口 学习通官网网页版直接打开
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
极兔快递快件信息查询系统 极兔快递官网运单号追踪
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
海量存储:机器视觉智能化的核心基石
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
创客贴用户入口官网登录 创客贴网页版电脑版系统
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
蛙漫移动版在线看 蛙漫手机浏览器直达入口
age动漫网站入口 age动漫官网直接访问入口
126邮箱网页版官方入口 126邮箱账号在线登录平台
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
必由学官网快捷入口 必由学网页版在线学习平台
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
Node.js中HTML按钮与J*aScript函数交互的正确姿势
J*a TimerTask中HashMap意外清空的深层原因与解决方案
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
谷歌google账号怎么注册账号 谷歌账号注册官方流程
qq游戏网页版直接玩_qq游戏免下载快速入口
支付宝如何设置安全保护_支付宝安全设置的全面教程
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
poki免费入口快捷访问 poki人气小游戏直接玩站点
抖音从哪里进入网页版_抖音官方入口链接
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
QQ官网正版登录链接 QQ在线登录入口最新
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
AO3官网镜像链接 Archive of Our Own同人文在线浏览
蛙漫官方正版入口 蛙漫网页在线全集免费观看
Mac怎么锁定备忘录_Mac备忘录加密设置教程
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
uc浏览器网页版入口 uc浏览器网页版最新网址
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】


2025-11-17
浏览次数:次
返回列表
程可获得独占锁(.lock())