讀者-寫者同步問題的寫者優先實現
阿新 • • 發佈:2019-01-10
介紹
訊號量的資料結構
訊號量semaphore s
包含:一個初始值為正的整數: s.count
一個初始為空的佇列: s.queue
其上定義了三個原子操作:
1. 初始化s
2. semWait 操作(P操作)使訊號量減1。若值為負,則執行semWait的程序被阻塞。否則程序繼續執行。
3. semSignal操作(V操作)使訊號量加1。若值小於或等於零,則被semWait操作阻塞的程序被解除阻塞。
物理意義
S.count為正時表示資源的個數
S.count為負時表示等待程序的個數
P操作分配資源
V操作釋放資源
程式碼
int Rcount=0 ; //“正在讀”的程序數,初值是0。
int Wcount=0; //“等待寫”的程序數,初值是0。
semaphore r=1; //訊號量,用於Rcount的互斥。
semaphore w=1; //訊號量,用於Wcount的互斥。
semaphore RWmutex=1; //訊號量,用於讀者寫者互斥。
semaphore Wmutex=1; //訊號量,用於寫者互斥。
**writer**
P(w);
Wcount++;
if Wcount==1 then //第一個寫者進入時
P(RWmutex); //申請讀寫資源
V(w);
P(Wmutex);
writing;
V(Wmutex);
P(w);
Wcount--;
if Wcount==0 then
V(RWmutex); //釋放讀寫資源
V(w);
**Reader**
P(w); //如果有寫者在等待RWmutex,那麼它肯定佔有w,於是讀者在這裡會阻塞
V(w); //立即釋放掉,使寫者隨時可申請到w
P(r);
Rcount++;
if Rcount==1 then //第一個讀者進入時,
P(RWmutex); //如已有寫者,其會被阻塞
V(r);
reading;
P(r);
Rcount--;
If Rcount==0 then
V(RWmutex);
V(r);