读者-作者(读者饥饿)
readers-writers ( readers starvation )
维基百科上说"adds the constraint that no thread shall be allowed to starve"下面的代码,我不明白为什么没有饥饿。
例如:如果有很多作者在 reader 之前到达并且第一个作者花了很长时间完成他的写作,那么 r 可能会达到一些大的负数让我们说 -12345 然后在它之后 readers 开始与 writer 一起到达,并且操作系统总是选择 writer 来获取信号量而不是 reader,在这种情况下 readers 会饿死,是对还是我错了?
link : readers-writers problem
看link中的第三个readers-writers问题。
代码:
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);
发现问题:
请注意,此解决方案只能满足条件 "no thread shall be allowed to starve" 当且仅当信号量在阻塞和释放线程时保持先进先出顺序。
否则,例如,一个被阻塞的写入器可能会无限期地保持阻塞状态,而其他写入器的循环会先于信号量递减。
维基百科上说"adds the constraint that no thread shall be allowed to starve"下面的代码,我不明白为什么没有饥饿。 例如:如果有很多作者在 reader 之前到达并且第一个作者花了很长时间完成他的写作,那么 r 可能会达到一些大的负数让我们说 -12345 然后在它之后 readers 开始与 writer 一起到达,并且操作系统总是选择 writer 来获取信号量而不是 reader,在这种情况下 readers 会饿死,是对还是我错了? link : readers-writers problem
看link中的第三个readers-writers问题。
代码:
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);
发现问题: 请注意,此解决方案只能满足条件 "no thread shall be allowed to starve" 当且仅当信号量在阻塞和释放线程时保持先进先出顺序。 否则,例如,一个被阻塞的写入器可能会无限期地保持阻塞状态,而其他写入器的循环会先于信号量递减。