1. 程式人生 > >讀者-寫者同步問題的寫者優先實現

讀者-寫者同步問題的寫者優先實現

介紹

訊號量的資料結構

訊號量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);