訊號量解決讀寫者問題
阿新 • • 發佈:2019-02-18
讀者—寫者問題(Readers-Writers problem)也是一個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料(檔案、記錄)常被多個程序共享,但其中某些程序可能只要求讀資料(稱為讀者Reader);另一些程序則要求修改資料(稱為寫者Writer)。就共享資料而言,Reader和Writer是兩組併發程序共享一組資料區,要求:
(1)允許多個讀者同時執行讀操作;
(2)不允許讀者、寫者同時操作;
(3)不允許多個寫者同時操作。
Reader和Writer的同步問題分為讀者優先、弱寫者優先(公平競爭)和強寫者優先三種情況,它們的處理方式不同。
(1)讀者優先 。對於讀者優先,應滿足下列條件:
如果新讀者到:
①無讀者、寫者,新讀者可以讀;
②有寫者等待,但有其它讀者正在讀,則新讀者也可以讀;
③有寫者寫,新讀者等待。
如果新寫者到:
①無讀者,新寫者可以寫;
②有讀者,新寫者等待;
③有其它寫者,新寫者等待。
單純使用訊號量不能解決讀者與寫者問題,必須引入計數器rc對讀程序計數;rc_mutex是用於對計數器rc操作的互斥訊號量;write表示是否允許寫的訊號量;於是讀者優先的程式設計如下:
int rc=0; //用於記錄當前的讀者數量 semaphore rc_mutex=1; //用於對共享變數rc 操作的互斥訊號量 semaphore write=1; //用於保證讀者和寫者互斥地訪問的訊號量 void reader() do{ P(rc_mutex); //開始對rc共享變數進行互斥訪問 rc ++; //來了一個讀程序,讀程序數加1 if (rc==1) P(write); //如是第一個讀程序,判斷是否有寫程序在臨界區,若有,讀程序等待,若無,阻塞寫程序 V(rc_mutex); //結束對rc共享變數的互斥訪問 /* 讀檔案;*/ P(rc_mutex); //開始對rc共享變數的互斥訪問 rc--; //一個讀程序讀完,讀程序數減1 if (rc == 0) V(write); //最後一個離開臨界區的讀程序需要判斷是否有寫程序//需要進入臨界區,若有,喚醒一個寫程序進臨界區 V(rc_mutex); //結束對rc共享變數的互斥訪問 } while(1)