首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读写器的信号量解决方案:更新读取器计数和在读/写二进制信号量上等待或发送信号之间的顺序?

读写器的信号量解决方案:更新读取器计数和在读/写二进制信号量上等待或发送信号之间的顺序?
EN

Stack Overflow用户
提问于 2017-10-23 03:09:19
回答 1查看 1.4K关注 0票数 0

从操作系统概念出发

在解决first读取器写入器问题时,读取器进程共享以下数据结构: 信号量rw互斥= 1;信号量互斥= 1;int read_count = 0;do { wait(rw_mutex);。。。执行/*写入*/。。。信号(Rw_mutex); 图5.11作者过程的结构。 执行{等待(互斥);读取count++;如果(read_count == 1)等待(rw互斥);信号(互斥);。。。执行/*读取*/。。。等待(互斥);读取计数-;if (read_count == 0)信号(Rw_mutex);信号(互斥); 图5.12阅读器进程的结构。 信号量mutexrw_mutex初始化为1;读取计数初始化为0。信号量rw_mutex对读取器和写入进程都是通用的。在更新变量读取计数时,使用mutex信号量来确保互斥。reading变量跟踪当前读取对象的进程数量。信号量rw_mutex作为作者的互斥信号量。它也被进入或退出关键部分的first或最后一个读取器使用。当其他读者处于关键部分时,进入或退出的读者不使用它。

  1. 为什么wait/signalrw_mutex上由信号量mutex保护
  2. 在读取器进程的结构中,我可以在updaing read_countrw_mutex上的wait/signal之间切换顺序吗? do {等待(互斥);如果(read_count == 0)等待(Rw_mutex);读取count++;信号(互斥);。。。执行/*读取*/。。。等待(互斥);if (read_count == 1)信号(Rw_mutex);读计数-;信号(互斥);

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-10-29 18:13:48

  1. 为什么wait/signalrw_mutex上由信号量mutex保护

假设没有,即只有read_count行被保护,并且您有读取器线程α和β。

CPU增加read_count,执行signal(mutex),然后执行if (read_count == 1),- bah!-CPU调度器决定“足够了,让其他线程也玩得开心!”,并开始执行线程β。

线程mutex锁定read_count,增加read_count,释放mutex,并开始执行if (read_count == 1)。现在,因为read_count是2,所以两个线程中的比较都失败了,所以没有一个读取器使用rw_mutex,您的作者会对正在读取的数据进行写入。

  1. 在读取器过程的结构中,我是否可以在更新read_countwait/signal之间切换顺序,如下所示?

可以,停那儿吧。这一区别纯粹是语义上的:原文为“我们即将阅读,所以增加read_count__,如果我们是唯一的读取器,锁定rw_mutex__。执行阅读。然后,就像我们做的那样,减少read_count__,如果我们是最后一个读取器,则解锁rw_mutex__”。

你的变体读起来像是“如果没有人读,锁定rw_mutex__。然后增加read_count__。执行阅读。然后,如果我们是唯一的读取器,那么解锁rw_mutex__。减少read_count__”。

不过,出于一点兴趣,如果作者使用了您的变体,我对第一个问题的回答可能会更长一些,因为在使用signal(rw_mutex)的部分代码中,您可能会得到一个死锁:Ь

此外,作者在C++中描述的概念是互斥

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46881402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档