它在维基百科中说,下面的代码“增加了不允许线程饿死的约束”,我无法理解为什么没有饥饿。 例如:如果有很多作家在任何读者面前到达并且第一位作家花了很长时间才能完成他的写作,那么如果r可能会达到一个大的减号,那就说-12345并且在读者开始与作家一起到达之后怎么办?不知何故,操作系统总是选择编写器来获取信号量而不是读者,在这种情况下,读者会饿死,是对还是我错了? 链接:readers-writers problem
查看链接中的第三个读者 - 作者问题。
代码:
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);
答案 0 :(得分:0)
发现问题: 请注意,此解决方案只能满足以下条件:不允许任何线程饿死"当且仅当信号量在阻塞和释放线程时保留先进先出顺序。 否则,例如,一个被阻止的编写器可能会无限期地被一个其他编写器递减信号量的循环阻塞。