3

我无法理解为什么第一个读写器问题会使写入进程饿死,即:代码如何为读取器进程提供优先级?当其中一个读取器进程执行时,写入器进程是否应该无法获得锁signal(wrt)?信号量列表是结构化的(正如我所见,写入者将如何被 LIFO 列表中稳定的读取器进程流饿死)以优先考虑读取器进程,还是我误解了这里的一些基本内容?

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);
}
4

1 回答 1

3

如果您始终有 2 个或更多阅读器处于活动状态,signal(wrt)则永远不会在阅读器块的末尾调用。新读者不会有readcount == 1,所以他们不会等待 wrt,但他们会增加阅读次数。这使得无休止的读取请求使写入线程饿死。如果读者计数为 0,则 wrt 将被释放,并且 writer 最终可以工作。在那之前,读者有优先权。

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

于 2013-04-10T17:24:05.197 回答