讀者優先演算法:
設定兩個互斥訊號量: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