我无法理解为什么第一个读者 - 编写者问题会使编写过程挨饿,即:代码如何为读者进程提供优先权?当其中一个读者进程执行signal(wrt)
时,编写者进程是否无法获得锁定?是不是信号量的列表是结构化的(因为我可以看到作者会如何在LIFO列表中稳定的读者流程中挨饿)以优先考虑读者流程,还是我误解了一些基本的东西?< / p>
semaphore wrt=1,mutex=1;
readcount=0;
writer()
{
wait(wrt);
//writing is done
signal(wrt);
}
reader()
{
wait(mutex);
readcount++;
if(readcount==1)
wait(wrt);
signal(mutex);
///Do the Reading
///(Critical Section Area)
wait(mutex);
readcount--;
if(readcount==0)
signal(wrt);
signal(mutex);
}
答案 0 :(得分:3)
如果您总是有2个或更多阅读器处于活动状态,则signal(wrt)
永远不会在阅读器块结束时被调用。新读者不会readcount == 1
所以他们不会等待wrt,但他们会增加readcount。这使得无休止的读取请求会使编写器线程陷入困境。如果读者数量达到0,则wrt将被释放,作者最终可以工作。在此之前,读者有优先权。
这不是精确的LIFO方法,而是读者优先的优先队列。