1. 程式人生 > >訊號量解決讀寫者問題

訊號量解決讀寫者問題

讀者寫者問題(Readers-Writers problem也是一個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料(檔案、記錄)常被多個程序共享,但其中某些程序可能只要求讀資料(稱為讀者Reader);另一些程序則要求修改資料(稱為寫者Writer)。就共享資料而言,ReaderWriter是兩組併發程序共享一組資料區,要求:

1)允許多個讀者同時執行讀操作;

2)不允許讀者、寫者同時操作;

3)不允許多個寫者同時操作。

ReaderWriter的同步問題分為讀者優先、弱寫者優先(公平競爭)和強寫者優先三種情況,它們的處理方式不同。

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)