读写锁问题

qq_20334231 2018-03-13 02:43:38
class rwlock {
private:
mutex m;
condition_variable wcv,rcv;
unsigned writer, reader;
int active;
public:
rwlock() :writer(0), reader(0), active(0) {}

void readLock() {
unique_lock<mutex>lk(m);
++reader;
while (active < 0 || writer>0)rcv.wait(lk);
--reader;
++active;
}
//多个读者可以同时读文件
//写者在写文件时不允许有读者在读文件
//读者读时写者也不能写

void writeLock() {
unique_lock<mutex>lk(m);
++writer;
while (active != 0)wcv.wait(lk);
--writer;
active = -1;
}

void unlock() {
unique_lock<mutex>lock(mutex);
if (active > 0) {
--active;
if (active == 0)wcv.notify_one();
}
else {
active = 0;
if (writer > 0)wcv.notify_one();
else if (reader > 0)rcv.notify_all();
}
}
};


一个写者多读者:
多个读者可以同时读文件,
写者在写文件时不允许有读者读,
有读者读时写者也不能写

active是用来做什么的呢?
...全文
255 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2018-03-14
  • 打赏
  • 举报
回复
引用 4 楼 qq_20334231 的回复:
这里--writer;和--reader为什么不放在unlock里面呢?锁定的时候感觉用户还没用完啊?
writer不代表有几个写入者,代表的是有几个写入者没获得资源正在等待 reader不代表有几个读取者,代表的是有几个读取者没有获得资源正在等待
赵4老师 2018-03-14
  • 打赏
  • 举报
回复
《Windows核心编程》
qq_20334231 2018-03-14
  • 打赏
  • 举报
回复
这里--writer;和--reader为什么不放在unlock里面呢?锁定的时候感觉用户还没用完啊?
mstlq 2018-03-13
  • 打赏
  • 举报
回复
另外active为-1时表示有一个写入者已经获取了资源
mstlq 2018-03-13
  • 打赏
  • 举报
回复
active用来记住有几个读者已经获取了资源
sdghchj 2018-03-13
  • 打赏
  • 举报
回复
用来记录有多少个读者。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧