wait(s) 等價與P操作, signal(s)等價於V操作
生產者-消費者問題
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void procuder() {
do {
procuder an item nextp;
...
wait(empty);//表示空緩沖區-1;
wait(mutex);//數據緩沖區互斥訪問,關閉訪問;
buffer[in] = nextp;
in = (in+1) % n;
signal(mutex);//打開訪問
signal(full);//滿緩沖區加+1
} while (true);
}
void consumer() {
do {
wait(full);//判斷是否有滿緩沖區,滿緩沖區-1
wait(mutex);
nextc = buffer[out];
out = (out+1) % n;
signal(mutex);
siganl(empty);//空緩沖區+1
consumer the item in nextc;
....
} while (true);
}
void main() {
cobegin
producer(); consumer();
coend
}
爸爸媽媽洗水果,兒子女兒吃水果問題
問題描述:爸爸專向盤中放蘋果,媽媽專向盤中放橘子,兒子專等吃盤里的橘子,女兒專等吃盤里的蘋果。只要盤子空,爸爸媽媽可向盤中放水果,僅當盤中有自己需要的水果時,兒子或女兒可從中取出,請給出他們四人之間的同步關系,並用PV操作實現四人正確活動的程序。。使用p、v操作來完成父親、媽媽、兒子、女兒的同步行為模擬。
semaphore putmutex = 1, getmutex = 0;
semaphore empty = 1, apple = 0, orange = 0;
void father() {
do {
wait(putmutex);
apple++;
empty--;
signal(putmutex);
} while (true);
}
void mother() {
do {
wait(putmutex);
orange++;
empty--;
signal(putmutex);
} while (true);
}
void son() {
do {
wait(getmutex);
orange--;
empty++;
signal(getmutex);
} while (true);
}
void daughter() {
do {
wait(getmutex);
apple--;
empty++;
signal(getmutex);
} while (true);
}
void main() {
cobegin
father(); mother(); son(); daughter();
coend
}
此外 ,可參考java的實現:http://www.cnblogs.com/zyp4614/p/6555530.html
司機,售票員問題
問題:
司機開車,售票員售票。當售票員將門關上的時候司機才可以開車,當司機將車到站停下的時候,售票員才可以打開車門。
對S1(門): 門有兩個狀態,開和關。售票員將門關上之后,應該將門的操作權給司機(因為只有司機到站了才能停車)。因此0為門開着狀態。
對S2(車):兩個狀態,開車行駛和到站停車。當車開的時候,需要申請車的資源,即用wait,則車在停着的時候狀態為1,行駛時狀態為0.
司機:開車,正常行駛,到站停車
售票員:關門,售票,開門
S1表示是否允許司機啟動汽車;S1 = 1表示可以啟動,S2 = 0表示不能啟動。
S2表示是否允許售票員關車門;S2 = 1表示允許售票員關車門,S2 = 0表示不允許售票員關車門。
semaphore s1 = 1, s2 = 0;
void driver() {
do {
wait(s1);// P(S1)
開車;
正常行駛;
到站停車;
signal(s2);//V(S2)
} while (true);
}
void seller() {
do {
關門;
signal(s1);// V(S1)
售票;
wait(S2);//P(S2)
開車門;
上下乘客;
} while (true);
}
void main() {
cobegin
driver(); seller();
coend
}
可參考博客: http://m.blog.csdn.net/Y_215/article/details/53467517