1. 程式人生 > >使用訊號量解決讀者寫者問題--讀者優先

使用訊號量解決讀者寫者問題--讀者優先

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

也會被阻塞在 wsem上.而後續的讀程序會被阻塞在第一個semWait(x);上.

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);而寫程序無法搶佔讀程序.

所以為讀優先;