Operating system 读者作家(读者饥饿)
维基百科上说,下面的代码“增加了不允许任何线程饿死的限制”,我不明白为什么没有饿死。 例如:如果有很多作者在任何读者之前到达,并且第一个作者花了很长时间完成他的写作,那么r可能会达到一些大的负数,比如说-12345,然后读者开始与作者一起到达,不知怎的,操作系统总是选择writer来接收信号量,而不是reader,如果那样的话,读者会挨饿,这是对的还是我错了? 链接: 请看链接中的第三个读者-作者问题 代码:Operating system 读者作家(读者饥饿),operating-system,semaphore,Operating System,Semaphore,维基百科上说,下面的代码“增加了不允许任何线程饿死的限制”,我不明白为什么没有饿死。 例如:如果有很多作者在任何读者之前到达,并且第一个作者花了很长时间完成他的写作,那么r可能会达到一些大的负数,比如说-12345,然后读者开始与作者一起到达,不知怎的,操作系统总是选择writer来接收信号量,而不是reader,如果那样的话,读者会挨饿,这是对的还是我错了? 链接: 请看链接中的第三个读者-作者问题 代码: int readcount; // (initial value = 0) semap
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);
发现问题:
请注意,此解决方案仅当且仅当信号量在阻塞和释放线程时保持先进先出顺序时,才能满足“不允许任何线程饿死”的条件。
否则,例如,一个被阻止的写入程序可能会无限期地保持被阻止状态,其他写入程序的周期会在它可以被阻止之前减少信号量