讀者寫者問題(semaphore)

來源:互聯網
上載者:User

讀者優先演算法

設定兩個互斥訊號量:rwmutex 用於寫者與其他讀者/寫者互斥的訪問共用資料
                    rmutex  用於讀者互斥的訪問讀者計數器readcount

var rwmutex, rmutex : semaphore := 1,1 ;int readcount = 0; cobegin       readeri begin  // i=1,2,….              P(rmutex);              Readcount++;              If (readcount == 1) P(rwmutex);              V(rmutex);              讀資料;              P(rmutex);              Readcount--;              If (readcount == 0) V(rwmutex);              V(rmutex);       End
       Writerj begin // j = 1,2,….              P(rwmutex);              寫更新;              V(rwmutex);       End Coend 

寫者優先:

條件:

1)多個讀者可以同時進行讀
2)寫者必須互斥(只允許一個寫者寫,也不能讀者寫者同時進行)
3)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)

解1:如果讀者數是固定的,我們可採用下面的演算法:

rwmutex:用於寫者與其他讀者/寫者互斥的訪問共用資料
rmutex: 該訊號量初始值設為10,表示最多允許10個讀者進程同時進行讀操作

var rwmutex, rmutex : semaphore := 1,10 ;
cobegin
       readeri begin  // i=1,2,….
              P(rwmutex);  //讀者、寫者互斥
              P(rmutex);
              V(rwmutex);  // 釋放讀寫互斥訊號量,允許其它讀、寫進程訪問資源
              讀資料;
              V(rmutex);
       End             

       Writerj begin // j = 1,2,….
              P(rwmutex);
              For (i=1;i<=10;i++) P(rmutex); //禁止新讀者,並等待已進入的讀者退出
              寫更新;
              For (i=1;i<=10;i++) V(rmutex); // 恢複允許rmutex 值為10
              V(rwmutex);
       End
Coend

 

解2:如果讀者數不固定,採用下面的演算法:

設定三個互斥訊號量:rwmutex 用於寫者與其他讀者/寫者互斥的訪問共用資料
                    rmutex  用於讀者互斥的訪問讀者計數器readcount                                                   nrmutex 用於寫者等待已進入讀者退出,所有讀者退出前互斥寫操作

var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ;
int readcount = 0;
cobegin
       readeri begin  // i=1,2,….
              P(rwmutex);
              P(rmutex);
              Readcount++;
              If (readcount == 1) P(nrmutex); //有讀者進入,互斥寫操作
              V(rmutex);
              V(rwmutex); // 及時釋放讀寫互斥訊號量,允許其它讀、寫進程申請資源
              讀資料;
              P(rmutex);
              Readcount--;
              If (readcount == 0) V(nrmutex); //所有讀者退出,允許寫更新
              V(rmutex);
       End

       Writerj begin // j = 1,2,….
              P(rwmutex);  // 互斥後續其它讀者、寫者
              P(nrmutex);  //如有讀者正在讀,等待所有讀者讀完
              寫更新;
              V(nrmutex);   //允許後續新的第一個讀者進入後互斥寫操作
              V(rwmutex);  //允許後續新讀者及其它寫者
       End
Coend

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.