新闻中心

C++怎么实现一个读写锁_C++并发编程与读写锁实现

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

c++怎么实现一个读写锁_c++并发编程与读写锁实现

在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 Background Remover

Zyro推出的AI图片背景移除工具

Zyro AI Background Remover 145 查看详情 Zyro AI Background Remover
  • 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电池设置查看应用能耗排行榜【优化】 

搜索