当前位置: 首页 > news >正文

C++ WINDOWS XP系统 读写锁

参考libuv库:The Windows SRWLock primitive can be used for rw locking instead of a custom CRITICAL_SECTION+Semaphore implementation #3382 by dmachaj · Pull Request #3383 · libuv/libuv · GitHub 


#include <iostream>
#include <vector>
#include <thread>
#include <Windows.h>class ReadWriteLock {
public:ReadWriteLock() {/* Initialize the semaphore that acts as the write lock. */HANDLE handle = CreateSemaphoreW(NULL, 1, 1, NULL);if (handle == NULL){std::cout << "init error\n";// return uv_translate_sys_error(GetLastError());}m_write_semaphore = handle;/* Initialize the critical section protecting the reader count. */InitializeCriticalSection(&m_num_readers_lock);/* Initialize the reader count. */m_num_readers = 0;}~ReadWriteLock() {DeleteCriticalSection(&m_num_readers_lock);CloseHandle(m_write_semaphore);}bool TryReadLock(){bool err;if (!TryEnterCriticalSection(&m_num_readers_lock)){std::cout << "TryEnterCriticalSection error\n";return false;}err = true;if (m_num_readers == 0) {/* Currently there are no other readers, which means that the write lock* needs to be acquired.*/DWORD r = WaitForSingleObject(m_write_semaphore, 0);if (r == WAIT_OBJECT_0)m_num_readers++;else if (r == WAIT_TIMEOUT){std::cout << "try read lock WAIT_TIMEOUT error\n";err = false;}else if (r == WAIT_FAILED){std::cout << "fatal! try read lock\n";//uv_fatal_error(GetLastError(), "WaitForSingleObject");err = false;}}else {/* The write lock has already been acquired because there are other* active readers.*/m_num_readers++;}LeaveCriticalSection(&m_num_readers_lock);return err;}void ReadLock() {/* Acquire the lock that protects the reader count. */EnterCriticalSection(&m_num_readers_lock);/* Increase the reader count, and lock for write if this is the first* reader.*/if (++m_num_readers == 1) {DWORD r = WaitForSingleObject(m_write_semaphore, INFINITE);if (r != WAIT_OBJECT_0){std::cout << "read lock error\n";//uv_fatal_error(GetLastError(), "WaitForSingleObject");}}/* Release the lock that protects the reader count. */LeaveCriticalSection(&m_num_readers_lock);}void ReadUnlock() {EnterCriticalSection(&m_num_readers_lock);if (--m_num_readers == 0) {if (!ReleaseSemaphore(m_write_semaphore, 1, NULL)){std::cout << "read unlock error\n";//uv_fatal_error(GetLastError(), "ReleaseSemaphore");}}LeaveCriticalSection(&m_num_readers_lock);}bool TryWriteLock(){DWORD r = WaitForSingleObject(m_write_semaphore, 0);if (r == WAIT_OBJECT_0){std::cout << "try write lock success\n";return true;}else if (r == WAIT_TIMEOUT){std::cout << "try write lock WAIT_TIMEOUT\n";return false;}else{std::cout << "try write lock fatal\n";return false;//uv_fatal_error(GetLastError(), "WaitForSingleObject");}}void WriteLock() {DWORD r = WaitForSingleObject(m_write_semaphore, INFINITE);if (r != WAIT_OBJECT_0){std::cout << "write lock error\n";//uv_fatal_error(GetLastError(), "WaitForSingleObject");}else{std::cout << "get write lock\n";}}void WriteUnlock() {if (!ReleaseSemaphore(m_write_semaphore, 1, NULL)){std::cout << "ReleaseSemaphore error: " << GetLastError();//uv_fatal_error(GetLastError(), "ReleaseSemaphore");}std::cout << "write unlock\n";}private:unsigned int     m_num_readers;CRITICAL_SECTION m_num_readers_lock;HANDLE           m_write_semaphore;
};#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
#include <map>
#include <string>// Include your ReadWriteLock class definition hereReadWriteLock rwLock;
std::map<int,std::string> g_map;void ReaderThread(int id) {int i = 0;while (i < 100) {if (rwLock.TryReadLock()){//rwLock.ReadLock();//std::cout << "read: " << g_map[g_map.size() - 1] << std::endl;//rwLock.ReadUnlock();}else{std::cout << "try read lock error!\n";}//std::this_thread::sleep_for(std::chrono::milliseconds(100));//i++;}
}void WriterThread(int id) {int i = 0;while (i < 100) {if (rwLock.TryWriteLock()){//rwLock.WriteLock();//g_map[g_map.size() + 1] = std::to_string(g_map.size()) + "_value";std::cout << "write: " << g_map.size() << std::endl;//rwLock.WriteUnlock();}else{std::cout << "try write lock error!\n";}std::this_thread::sleep_for(std::chrono::milliseconds(10));//i++;}
}int main() {g_map[0] = "init";const int numReaders = 10;const int numWriters = 1;std::vector<std::thread> readerThreads;std::vector<std::thread> writerThreads;for (int i = 0; i < numReaders; ++i) {readerThreads.emplace_back(ReaderThread, i);}for (int i = 0; i < numWriters; ++i) {writerThreads.emplace_back(WriterThread, i);}// Join all the threadsfor (int i = 0; i < numReaders; ++i) {readerThreads[i].join();}for (int i = 0; i < numWriters; ++i) {writerThreads[i].join();}return 0;
}

相关文章:

  • 【Vue】组件封装小技巧 — 利用$listener和v-on接收父组件传递的事件
  • ubuntu挂载共享目录的方法
  • 导出数据为zip压缩文件,解压后为json文件
  • 6-会话、过滤器、监听器
  • ZZ038 物联网应用与服务赛题第D套
  • 目前为止看过最帅气的一篇论文YOLOv3: An Incremental Improvement(2018.4)
  • Cuda cmake支持C++17
  • 学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令
  • AI:63-基于Xception模型的服装分类
  • 大数据学习之Spark性能优化
  • USB HID在系统下通信的一些总结
  • IP地址修改方法有哪几种
  • C#学习中关于Visual Studio中ctrl+D快捷键(快速复制当前行)失效的解决办法
  • 基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 失物招领小程序 设计与实现
  • 富文本编辑器
  • [译] React v16.8: 含有Hooks的版本
  • gops —— Go 程序诊断分析工具
  • MD5加密原理解析及OC版原理实现
  • opencv python Meanshift 和 Camshift
  • Redash本地开发环境搭建
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • storm drpc实例
  • ubuntu 下nginx安装 并支持https协议
  • 诡异!React stopPropagation失灵
  • 理清楚Vue的结构
  • 每天一个设计模式之命令模式
  • 那些年我们用过的显示性能指标
  • 微信公众号开发小记——5.python微信红包
  • 物联网链路协议
  • 怎么将电脑中的声音录制成WAV格式
  • MyCAT水平分库
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (生成器)yield与(迭代器)generator
  • (转)ORM
  • (转)母版页和相对路径
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET中 MVC 工厂模式浅析
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @font-face 用字体画图标
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [20140403]查询是否产生日志
  • [30期] 我的学习方法
  • [Asp.net mvc]国际化
  • [IE技巧] 让IE 以全屏模式启动
  • [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
  • [LeetCode]-225. 用队列实现栈-232. 用栈实现队列
  • [Linux_IMX6ULL应用开发]-Makefile
  • [mysql]游标和触发器