Process 操作系统:首次读写器同步问题解决方案中的混乱
我正在研究这本书中的Process 操作系统:首次读写器同步问题解决方案中的混乱,process,operating-system,synchronization,semaphore,Process,Operating System,Synchronization,Semaphore,我正在研究这本书中的第一读者-作者问题的解决方案,它描述了: 第一个读卡器-写卡器问题,要求除非写卡器已经获得使用共享对象的权限,否则任何读卡器都不能一直等待。换句话说,任何读者都不应该仅仅因为作者在等待而等待其他读者完成 我从中了解到的是,如果有一个读者在奔跑,一个作家来了;然后,该写入程序将被阻止,直到读卡器完成。但在第一个读卡器完成的过程中,如果出现另一个读卡器(或多个读卡器),则该读卡器将优先于编写器 首先,如果我错了,请纠正我。但是如果我是对的,那么我所理解的是,Reader的代码不能
第一读者-作者问题的解决方案,它描述了:
第一个读卡器-写卡器问题,要求除非写卡器已经获得使用共享对象的权限,否则任何读卡器都不能一直等待。换句话说,任何读者都不应该仅仅因为作者在等待而等待其他读者完成
我从中了解到的是,如果有一个读者在奔跑,一个作家来了;然后,该写入程序将被阻止,直到读卡器完成。但在第一个读卡器完成的过程中,如果出现另一个读卡器(或多个读卡器),则该读卡器将优先于编写器
首先,如果我错了,请纠正我。但是如果我是对的,那么我所理解的是,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);
现在假设发生以下事件序列:
- 假设第一个读者来了,它在注释中提到的
行02
上阻止了作者
- 然后一个编写器来了,它正在等待
rw\u互斥
- 然后,第一个读卡器正在执行代码注释中提到的代码行
第03行
,并且它已经锁定了互斥
信号量
- 同时,第二个阅读器来了,它开始在代码注释中提到的第01行等待
- 现在,当第一个读卡器执行第04行时;它释放了
rw_互斥体上的锁
,在while循环中等待的写入程序现在被解锁并开始执行
- 当第一个读卡器执行
第04行
之后发出信号的互斥量
行时,第二个读卡器将解锁
现在,如果我们看到整个流程,那么编写器在第二个读卡器之前运行。那么,代码逻辑的工作原理是否与上述相同
如果我错了,请纠正我。是的,代码的工作原理与您理解的相同。您可以参考wiki页面,该页面具有您在讨论中包含的类似伪代码
Reader-Thread1释放rw_互斥锁后,Writer线程将立即获得该互斥锁。但正如您在用例中所解释的,这不会有什么问题
在第一个读写器问题中,如果进行了太多的读操作,写写写器可能会饿死。这段代码来自哪里?这段代码摘自前面提到的书(即操作系统概念-第9版),这就是问题所在。大多数问题都是从那本书的废话中提出的,而不是从任何其他来源提出的。那代码毫无意义。