利用记录型信号量机制: wait(s), signal(s)解决进程同步问题
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);//判斷是否有滿緩沖區,滿緩沖區-1wait(mutex);nextc = buffer[out];out = (out+1) % n;signal(mutex);siganl(empty);//空緩沖區+1consumer the item in nextc;....} while (true); }void main() {cobeginproducer(); 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() {cobeginfather(); 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表示不允許售票員關車門。
可參考博客: http://m.blog.csdn.net/Y_215/article/details/53467517
轉載于:https://www.cnblogs.com/ToBeOrNotToBe/p/7125010.html
總結
以上是生活随笔為你收集整理的利用记录型信号量机制: wait(s), signal(s)解决进程同步问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [SinGuLaRiTy] KM算法
- 下一篇: java之路漫漫(一)