c++读写锁的实现

一、使用互斥锁和条件变量实现读写锁:

 

  1. class readwrite_lock  
  2. {  
  3. public:  
  4.     readwrite_lock()  
  5.         : stat(0)  
  6.     {  
  7.     }  
  8.   
  9.     void readLock()  
  10.     {  
  11.         mtx.lock();  
  12.         while (stat < 0)  
  13.             cond.wait(mtx);  
  14.         ++stat;  
  15.         mtx.unlock();  
  16.     }  
  17.   
  18.     void readUnlock()  
  19.     {  
  20.         mtx.lock();  
  21.         if (--stat == 0)  
  22.             cond.notify_one(); // 叫醒一个等待的写操作  
  23.         mtx.unlock();  
  24.     }  
  25.   
  26.     void writeLock()  
  27.     {  
  28.         mtx.lock();  
  29.         while (stat != 0)  
  30.             cond.wait(mtx);  
  31.         stat = -1;  
  32.         mtx.unlock();  
  33.     }  
  34.   
  35.     void writeUnlock()  
  36.     {  
  37.         mtx.lock();  
  38.         stat = 0;  
  39.         cond.notify_all(); // 叫醒所有等待的读和写操作  
  40.         mtx.unlock();  
  41.     }  
  42.   
  43. private:  
  44.     mutex mtx;  
  45.     condition_variable cond;  
  46.     int stat; // == 0 无锁;> 0 已加读锁个数;< 0 已加写锁  
  47. };  


二、使用2个互斥锁实现读写锁:

 

  1. class readwrite_lock  
  2. {  
  3. public:  
  4.     readwrite_lock()  
  5.         : read_cnt(0)  
  6.     {  
  7.     }  
  8.   
  9.     void readLock()  
  10.     {  
  11.         read_mtx.lock();  
  12.         if (++read_cnt == 1)  
  13.             write_mtx.lock();  
  14.   
  15.         read_mtx.unlock();  
  16.     }  
  17.   
  18.     void readUnlock()  
  19.     {  
  20.         read_mtx.lock();  
  21.         if (--read_cnt == 0)  
  22.             write_mtx.unlock();  
  23.   
  24.         read_mtx.unlock();  
  25.     }  
  26.   
  27.     void writeLock()  
  28.     {  
  29.         write_mtx.lock();  
  30.     }  
  31.   
  32.     void writeUnlock()  
  33.     {  
  34.         write_mtx.unlock();  
  35.     }  
  36.   
  37. private:  
  38.     mutex read_mtx;  
  39.     mutex write_mtx;  
  40.     int read_cnt; // 已加读锁个数  
  41. };  


用mutex和conditon实现写优先的读写锁

  1. class RWLock {  
  2. private:  
  3.     pthread_mutex_t mxt;  
  4.     pthread_cond_t cond;  
  5.     int rd_cnt;//等待读的数量  
  6.     int wr_cnt;//等待写的数量  
  7.   
  8. public:  
  9.     RWLock() :rd_cnt(0), wr_cnt(0) {  
  10.         pthread_mutex_init(&mxt,NULL);  
  11.         pthread_cond_init(&cond,NULL);  
  12.     }  
  13.   
  14.     void readLock() {  
  15.         pthread_mutex_lock(&mxt);  
  16.   
  17.         ++rd_cnt;  
  18.         while(wr_cnt > 0)  
  19.             pthread_mutex_wait(&cond, &mxt);  
  20.           
  21.         pthread_mutex_unlock(&mxt);  
  22.     }  
  23.   
  24.     void readUnlock() {  
  25.         pthread_mutex_lock(&mxt);  
  26.           
  27.         --rd_cnt;  
  28.         if (rd_cnt == 0 )  
  29.             pthread_cond_signal(&cond);  
  30.   
  31.         pthread_mutex_unlock(&mxt);  
  32.     }  
  33.   
  34.     void writeLock() {  
  35.         pthread_mutex_lock(&mxt);  
  36.   
  37.         ++wr_cnt;  
  38.         while (wr_cnt + rd_cnt >=2)  
  39.             pthread_cond_wait(&cond, &mxt);  
  40.   
  41.         pthread_mutex_unlock(&mxt);  
  42.     }  
  43.   
  44.     void writerUnlock() {  
  45.         pthread_mutex_lock(&mxt);  
  46.   
  47.         --wr_cnt;  
  48.         if(wr_cnt==0)  
  49.             pthread_cond_signal(&cond);  
  50.   
  51.         pthread_mutex_unlock(&mxt);  
  52.     }  
  53. }; 
c++11实现写优先的读写锁 先直接贴出代码: 可以看出用c++11实现读写锁变得非常简洁,在读取量非常大且写入频率很低的时候,通过一个简单的写入线程计数可以避免大量的 cond_w.notify_one();减少读取线程因此发生的切换。 阅读详情

相关推荐

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-优快云博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3163

【C++ 多线程:读写锁的实现及使用样例】

【C++ 多线程(五):读写锁的实现及使用样例】

Sugar_wolf的博客 1804

到底是什么决定了二极管的最高工作频率?

硬件工程师,应该都用过二极管的吧,不过也许有一个误区,大多数人可能并不知道,或者说是理解有问题,下面就来细细说下。 一个问题 先提一个问题:到底是什么决定了二极管的最高工作频率? 估计有不少人会回答是二极管反向恢复时间Trr,也有人会说是二极管结电容,那到底谁是对的呢?或者说都一样,反向恢复时间由结电容决定? 到底什么决定了二极管的最高工作频率,我们暂且不论,不过需要知道的是,二极管的反向恢复时间和结电容根本就是两回事,反向恢复时间绝不能等同于结电容的充放电时间。 为什么我这么说呢?.

weixin_42005993的博客 4831

C++实现读写锁

在C++中,实现读写锁可以使用,它是C++17标准中引入的。读写锁允许多个线程同时读取一个共享资源,但在写入时,只允许一个线程对资源进行写入,并阻止其他线程读取或写入。下面是使用实现读写锁的示例代码,包括一个简单的共享数据访问类和在mainSharedDatareadDatawriteDatamain替换和为你的文件名和希望生成的程序名。这段代码在一个多线程环境下测试了读写锁的工作方式。

琅嬛福地 1781

GAMIT基线解算实战:从RINEX数据准备到精度报告解读(附2024年tables更新攻略)

本文详细解析了2024年GAMIT基线解算全流程,从RINEX数据准备到精度报告解读,特别更新了tables配置攻略。涵盖工程目录设计、数据预处理、关键配置文件更新及基线解算策略优化,帮助用户掌握高精度GNSS数据处理技术,提升解算效率和结果可靠性。

weixin_42520374的博客 305

让AI稳定生成流程图:基于Skill与Mermaid的工程化实践

流程图是软件工程中沟通业务逻辑的通用语言,但其绘制与维护却长期依赖手工工具,导致文档更新滞后、协作成本高。随着大语言模型技术的成熟,自然语言生成代码已成为可落地的技术路径,而Mermaid作为一款文本化图表语法,凭借其可版本管理、可自动渲染和可嵌入文档的优势,正逐步取代传统绘图工具。要让AI稳定输出合格的流程图,关键在于为模型定义一套清晰的Skill规则,约束输入结构、处理逻辑和输出格式。本文从流程图的工程痛点出发,介绍如何利用大模型将自然语言描述转化为结构化文本,再通过Mermaid CLI渲染成可视化图

weixin_42548782的博客 306

C++模拟实现读写锁

本文介绍了读者写者问题,并用C++模拟实现了读写锁。

写博客记录分享学习笔记 1487

告别虚拟机!在Windows上用WSL+VSCode搞定ArduPilot开发环境(保姆级避坑指南)

本文提供了一份详细的保姆级指南,介绍如何在Windows上使用WSL和VSCode搭建高效的ArduPilot开发环境,告别虚拟机性能损耗。从WSL安装、VSCode配置到ArduPilot固件编译和调试技巧,涵盖开发全流程中的关键步骤和常见问题解决方案,帮助无人机开发者快速构建专业级开发环境。

weixin_42543046的博客 460

c++11 读写锁实现

【代码】c++11 读写锁实现。

yuanshenqiang的博客 870

金桔智慧物流之容器(托盘、周转箱等)定位及周转方案原理

金桔智慧物流之容器(托盘、周转箱等)定位及周转方案原理 在物流行业种,托盘是标准化运输的关键的配件,而容器存在丢失、盘点、闲置等管理问题。如何通过信息化的手段提升容器的寿命,提高调配效率,降低闲置是物流容器行业的关键点。 金桔蓝牙网关配合金桔蓝牙资产管理终端可以解决物流行业痛点问题。 容器管理面临的问题: 技术方案 场景描述之库房 场景描述之车辆 场景描述之终端 方案优势 ...

jinjufocus的博客 1180

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

算法大师! 396

c++读写锁实现

c++读写锁实现 C++17,提供了shared_mutex。配合C++14,提供的shared_lock。及C++11,提供的 unique_lock, 可以方便实现读写锁。 但上述的前提是,允许你使用C++17。在国内的开发环境下,别说C++17,连C++11用的也不多。 所以,大多数时候,我们需要自己实现一套C++读写锁(C++11环境下)。 代码实现 RWLock.h #ifnd...

林多 1万+

游戏引擎揭秘:大厂为何死磕自研?

游戏引擎本质与商业价值解析 游戏引擎是集成了渲染、物理、动画等核心功能的开发工具包,其价值在于让开发者免于重复编写底层代码,专注于游戏内容创作。商业引擎(如Unity/Unreal)虽降低了开发门槛,但头部厂商仍坚持自研引擎,主要基于以下考量: 经济性:长期项目分摊自研成本后,比商业引擎分成更划算; 可控性:完全掌握底层代码,能针对性优化核心玩法需求; 技术壁垒:专属引擎成为厂商的竞争优势,如米哈游的跨平台渲染技术; 项目适配:超大型游戏(开放世界/MMO)需要深度定制解决方案。 这种"短期高投入

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 263

C++读写锁以及实现方式

适用场景:需要理解底层原理,或在不支持C++20的环境中模拟读写锁。POSIX读写锁:适用于UNIX系统的高性能场景,但需手动管理锁生命周期。C++20共享互斥锁:跨平台、安全、简洁,推荐现代C++项目使用。自定义实现:帮助理解底层原理,但需谨慎处理线程安全和性能问题。合理使用读写锁能显著优化读多写少场景的并发性,但需注意避免死锁和饥饿问题,结合具体业务场景选择最优方案。参考资料。

w148_1748的博客 2036

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++11 读写锁实现计数器

C++11 读写锁实现计数器。

weixin_43254100的博客 256

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++用Mutex实现读写锁

1.C++ 哈希表底层实现原理2.C++构造、析构函数抛出异常?3.C++的虚函数的坑4.shared_ptr的线程安全性与再论cmu15445 project0的COW线程安全字典树5.C++用Mutex实现读写锁收起近期答辩完成了,想回头看看之前没做过的2PL。2和4是最简单的,没什么好说的。3比1略容易一些。

weixin_28702105的博客 75

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c++11 实现读写锁

Note: C++ 17里已经引进了读写锁 std::shared_mutex , 其lock()即以写方式加锁, 其lock_shared()即以读方式加锁。https://en.cppreference.com/w/cpp/thread/shared_mutex 实现一个读写锁类, 可以有两种方式获取锁,读方式,写方式。 允许多个"读线程"同时进入临界区,但是同一时刻只允许一个"写线程"进入临界区。当有写线程进入临界区时,不允许任何其他读或写线程同时进入。 写线程优先。方法:在类中增加成...

Peace 7805
上一篇: mongodb 使用场景和不使用场景
下一篇: Linux下搭建svn服务器并提供http访问
eric509
博客等级 码龄19年 8粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值