2013-04-10 104 views
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); 
} 

回答

3

如果你總是有2名或更多的讀者活躍,signal(wrt)將永遠不會得到所謂的讀者塊的結尾。新讀者不會有readcount == 1,所以他們不會等待wrt,但他們會增加讀數。這使得不斷髮出的讀取請求使作者線程陷於癱瘓。如果讀者數量達到0,那麼wrt將被釋放,作者終於可以工作。在此之前,讀者有優先權。

這不是精確的LIFO方法,而是讀者優先考慮的優先級隊列。

+0

完美,我錯過了,感謝您解釋它! – mino 2013-04-10 17:33:35