使用訊號量解決讀者寫者問題--讀者優先
阿新 • • 發佈:2019-02-14
<pre>
//讀者優先
int readcount = 0;
semaphore x = 1, wsem = 1;
void reader()
{
while(true){
semWait(x);
readcount ++ ;
if(readcount == 1)
semWait(wsem);
semSignal(x);
READUNIT();//讀資料
semWait(x);
readcount --;
if(readcount == 0 )
semSignal(wsem);
semSignal(x);
}
}
void writer()
{
while(true){
semWait(wsem);
WRITEUNIT();//寫資料
semSignal(wsem);
}
}
</pre>
訊號量x保證readCount被正確更新.wsem用於檔案讀寫的互斥.
分析:
1:對於寫程序. 如果一個寫執行semWait(wsem),然後寫WRITEUNIT();對於其他寫程序明顯回被阻塞在wsem上.而對於讀程序,第1個讀進if(readcount == 1) emWait(wsem);
2:如果多個讀程序要讀檔案,那麼第一個讀程序在if(readcount == 1) emWait(wsem);時如果有寫程序在寫,轉1.如果無寫程序,那麼wsem-1=0; 這樣就保證了讀的時候寫程序會被阻塞在wsem上. 而後續的讀程序可以直接讀檔案.當所有讀程序都讀完時if(readcount==0)semSignal(wsem); 阻塞在wsem上的寫程序就可以寫了.
綜上所述:
(1)只有當所有讀程序都讀完了,寫程序才可以寫.
(2)或者一個寫程序寫完後,semSignal(wsem),可能會被讀程序搶佔if(readcount == 1) emWait(wsem);而寫程序無法搶佔讀程序.