维基百科上说,下面的代码“增加了不允许任何线程饿死的限制”,我不明白为什么没有饿死。例如:如果有很多作者在任何读者之前到达,并且第一个作者花了很长时间完成他的写作,那么r可能会达到一些大的负数,比如说-12345,然后读者开始与作者一起到达,不知怎的,操作系统总是选择writer来接收信号量,而不是reader,如果那样的话,读者会挨饿,这是对的还是我错了?链接:读者和作者问题
请看链接中的第三个读者-作者问题。
代码:
int readcount; // (initial value = 0)
semaphore mutex_rdcnt, r, w; // ( initial value = 1 )
//READER
wait(r);
wait(mutex_rdcnt);
readcount++;
if (readcount == 1)
wait(w);
signal(mutex_rdcnt);
signal(r);
// reading is performed
wait(mutex_rdcnt);
readcount--;
if (readcount == 0)
signal(w);
signal(mutex_rdcnt);
//WRITER
wait(r);
wait(w);
// writing is performed
signal(w);
signal(r);
发现问题:请注意,此解决方案仅当且仅当信号量在阻塞和释放线程时保持先进先出顺序时,才能满足“不允许任何线程饿死”的条件。否则,例如,一个被阻止的写入程序可能会无限期地保持被阻止状态,其他写入程序的周期会在它可以被阻止之前减少信号量。
在《信号灯小书》一书中,第71页,存在以下问题: 写一个读者-作者问题的解决方案,优先考虑作者。也就是说,一旦写入程序到达,在所有写入程序离开系统之前,不应允许任何读卡器进入。 我得出了一个解决方案,但它与书中给出的有点不同。 共享变量: 表示初始化为1的信号量,而在本书中的定义如下: 读卡器逻辑: 编写器逻辑: 共享变量: 读卡器逻辑: 编写器逻辑: 1) 在阅读器逻辑中,在我的解决方案中,紧跟
读者 本书是为了那些在计算机领域有丰富知识,并且希望使用Subversion管理数据的人士准备的。尽管Subversion可以在多种不同的操作系统上运行,但其基本用户操作界面是基于命令行的,也就是我们将要在本书中讲述和使用的命令行工具(svn)。 出于一致性的考虑,本书的例子假定读者使用的是类Unix的操作系统,并且熟悉Unix和命令行界面。当然,svn程序也可以在入Microsoft Windo
问题内容: 我需要在我的软件中收集一些统计信息,并且我试图使其快速正确,这对我来说并不容易! 到目前为止,我的代码首先包含两个类,即StatsService和StatsHarvester 这是我的第二堂课,一个收割机,它不时收集统计数据并将其写入数据库。 在运行时,它将有大约30个并发运行的线程,每个线程调用约100次。只有一个StatsHarvester正在呼叫 所以我有很多作家,只有一个读者。
Introduction This is the fifth part of the chapter which describes synchronization primitives in the Linux kernel and in the previous parts we finished to consider different types spinlocks, semaphore
目标读者 这不是一本关于Python的语法书。 这个教程不会教你花哨的Python用法让你成为一名Python黑客。 我默认你已经了解Python的基础用法。如果你不知道,别往下看了。 先去看看Zed Shaw的免费教Python入门的书《Learn Python The Hard Way》。 我不知道你是不是在用Linux(最好是Ubuntu/Debian)或者是类Linux系统。 为毛?因为L
Feedback from our readers is always welcome. Let us know what you think about this book — what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get