从操作系统概念出发
在解决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阅读器进程的结构。 信号量
mutex
和rw_mutex
初始化为1;读取计数初始化为0。信号量rw_mutex
对读取器和写入进程都是通用的。在更新变量读取计数时,使用mutex
信号量来确保互斥。reading变量跟踪当前读取对象的进程数量。信号量rw_mutex
作为作者的互斥信号量。它也被进入或退出关键部分的first或最后一个读取器使用。当其他读者处于关键部分时,进入或退出的读者不使用它。
wait
/signal
在rw_mutex
上由信号量mutex
保护read_count
和rw_mutex
上的wait
/signal
之间切换顺序吗?
do {等待(互斥);如果(read_count == 0)等待(Rw_mutex);读取count++;信号(互斥);。。。执行/*读取*/。。。等待(互斥);if (read_count == 1)信号(Rw_mutex);读计数-;信号(互斥);谢谢。
发布于 2017-10-29 18:13:48
wait
/signal
在rw_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
,您的作者会对正在读取的数据进行写入。
read_count
和wait
/signal
之间切换顺序,如下所示?可以,停那儿吧。这一区别纯粹是语义上的:原文为“我们即将阅读,所以增加read_count
__,如果我们是唯一的读取器,锁定rw_mutex
__。执行阅读。然后,就像我们做的那样,减少read_count
__,如果我们是最后一个读取器,则解锁rw_mutex
__”。
你的变体读起来像是“如果没有人读,锁定rw_mutex
__。然后增加read_count
__。执行阅读。然后,如果我们是唯一的读取器,那么解锁rw_mutex
__。减少read_count
__”。
不过,出于一点兴趣,如果作者使用了您的变体,我对第一个问题的回答可能会更长一些,因为在使用signal(rw_mutex)
的部分代码中,您可能会得到一个死锁:Ь
此外,作者在C++中描述的概念是互斥。
https://stackoverflow.com/questions/46881402
复制相似问题