操作系統-進程同步經典問題-讀者寫者-寫者優先


嘖。這幾個月在肝GPA,沒有好好研究代碼,最近期末重新看操作系統,覺得這個問題非常有趣。

題目不用說了。

前提:

  可以允許多個讀者讀,但是只有一個寫者寫。

  寫者優先:在有讀者讀的時候,除非讀者是在臨界區內正在讀,否則在任何剩余時間寫者都應該能夠搶奪讀者。

       而要盡量保證寫者寫的時候,讀者不能搶奪寫者的訪問權。

int readerCount = 0, writerCount = 0;
semaphore x(1),y(1),z(1),rsem(1),wsem(1);

//reader
void reader()
{
    while(true){
        wait(z);// z 保證在writer處於critical section時,只有一個reader被堵在了rsem上,其余的reader被堵在了z上,這使得,當一個reader獲得了rsem在它處於critical section時,若此時來了一個writer,這個writer只需要等待這一個reader結束然后可以搶占,若沒有z,該writer可能要與多個reader搶占訪問權
            wait(rsem); // rsem writer能夠搶占reader的訪問權
                wait(x); // x 只用來確保readerCount的原子性操作
                    readerCount++;
                    if(readerCount == 1)
                        wait(wsem);// 在有讀者在critical section中讀時,防止此時有writer要修改critical section中的數據
                signal(x);
            signal(rsem);
        signal(z);

        READ();

        wait(x);
            readerCount--;
            if(readerCount == 0)
                signal(wsem);  // readerCount是此時critical section中的reader的數量,要保證critical section中的所有的reader全部讀完離開之后,才能允許writer進入寫數據
        signal(x);
    }
}

//writer
void writer()
{
    while(true){
        wait(y);// y用來保證writerCount 的原子性操作
            writerCount++;
            if(writerCount == 1)
                wait(rsem); // 防止此時reader進入讀數據
        signal(y);

        wait(wsem); // 此時只要搶占讀者的或上一個寫者的訪問權
            WRITE();
        signal(wsem);

        wait(y);
            writerCount--;
            if(writerCount == 0)
                signal(rsem);      // 只有所有寫者全部寫完,才允許讀者進行讀
        signal(y);

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM