我正在从Operating System Concepts (9th edition)一书中研究First Readers - Writers Problem
的解决方案,它描述了:
第一个读者 - 编写者问题,要求除非作者已经获得使用共享对象的许可,否则不会让读者等待。换句话说,没有读者应该等待其他读者完成,因为作家正在等待。
我从中得到的理解是,如果有任何读者在跑,而作家来了;那个作家将被阻止,直到读者完成。但是在第一个读者完成时,如果有另一个读者(或多个读者),则那些(那些)读者将优先于作者。
首先,如果我在这里错了,请纠正我。但如果我是对的,那么我所理解的是,Reader
的代码并不能保证这一点。
读写器代码如下:
//data structures
semaphore rw_mutex = 1;
semaphore mutex = 1;
int read_count = 0;
//Code for writer
do {
wait(rw_mutex);
. . .
/* writing is performed */
. . .
signal(rw_mutex);
} while (true);
//Code for reader
do {
wait(mutex); //Line 01
read_count++;
if (read_count == 1)
wait(rw_mutex); //Line 02
signal(mutex);
. . .
/* reading is performed */
. . .
wait(mutex); //Line 03
read_count--;
if (read_count == 0)
signal(rw_mutex); //Line 04
signal(mutex);
} while (true);
现在假设发生以下事件序列:
Line 02
行
rw_mutex
Line 03
中提到的代码行,它已锁定mutex
信号量Line 01
提及等待Line 04
时;它释放rw_mutex
上的锁定,正在等待其while循环的编写器现在解锁并开始执行Line 04
信号mutex
信号量现在,如果我们看到整体流量,那么the writer runs before the second reader
。那么代码逻辑的工作方式与上述相同吗?
如果我错了,请纠正我。
答案 0 :(得分:0)
是的,代码将与您理解的相同。您可以参考wiki页面here,其中包含您所包含的类似伪代码。
Writer线程将在Reader-Thread1释放后立即获取rw_mutex。但正如您在用例中所解释的那样,这没有任何问题。
在First-reader writer问题中,如果正在进行过多的读取操作,则编写者可能会受到匮乏。