读者 - 作家同步问题

时间:2013-04-10 17:19:08

标签: concurrency process synchronization readerwriterlock

我无法理解为什么第一个读者 - 编写者问题会使编写过程挨饿,即:代码如何为读者进程提供优先权?当其中一个读者进程执行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);
}

1 个答案:

答案 0 :(得分:3)

如果您总是有2个或更多阅读器处于活动状态,则signal(wrt)永远不会在阅读器块结束时被调用。新读者不会readcount == 1所以他们不会等待wrt,但他们会增加readcount。这使得无休止的读取请求会使编写器线程陷入困境。如果读者数量达到0,则wrt将被释放,作者最终可以工作。在此之前,读者有优先权。

这不是精确的LIFO方法,而是读者优先的优先队列。