天天看點

讀者-寫者同步問題的寫者優先實作介紹代碼

介紹

信号量的資料結構

信号量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。
int Wcount=;   //“等待寫”的程序數,初值是0。
semaphore r=;          //信号量,用于Rcount的互斥。
semaphore w=;          //信号量,用于Wcount的互斥。
semaphore RWmutex=;    //信号量,用于讀者寫者互斥。
semaphore Wmutex=;     //信号量,用于寫者互斥。

**writer**
P(w);
Wcount++;
if Wcount== then //第一個寫者進入時
  P(RWmutex); //申請讀寫資源
V(w);
P(Wmutex);
writing;
V(Wmutex);
P(w);
Wcount--;
if Wcount== then
  V(RWmutex); //釋放讀寫資源
V(w);


**Reader**
P(w); //如果有寫者在等待RWmutex,那麼它肯定占有w,于是讀者在這裡會阻塞
V(w); //立即釋放掉,使寫者随時可申請到w
P(r);
Rcount++;
if Rcount== then //第一個讀者進入時, 
  P(RWmutex); //如已有寫者,其會被阻塞
V(r);
reading;
P(r);
Rcount--;
If Rcount== then 
  V(RWmutex);
V(r); 
           

繼續閱讀