读写同步问题

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);
}
1个回答

3
如果您始终有两个或更多读取器活动,则 signal(wrt)将永远不会在读取器块结束时调用。新读取器将不具有 readcount == 1 ,因此它们不会等待wrt,但它们将增加readcount。这使得无休止的读取请求使写入线程饥饿。如果读取器计数达到0,则wrt将被释放,写入器才能正常工作。在此之前,读取器具有优先权。

这不是严格的LIFO方法,而是读者具有优先权的优先队列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接