介紹
信号量的資料結構
信号量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);