獨木橋問題
一個主修動物行爲學、輔修計算機科學的學生參加了一個課題,調查花果山的猴子是否能被教會理解死鎖。他找到一處峽谷,橫跨峽谷拉了一根繩索(假設爲南北方向)這樣猴子就可以攀着繩索越過峽谷。只要它們朝着相同的方向,同一時刻可以有多隻猴子通過。但是如果在相反的方向上同時有猴子通過則會發生死鎖(這些猴子將被卡在繩索中間,假設這些猴子無法在繩索上從另一隻猴子身上翻過去)。如果一隻猴子想越過峽谷,它必須看當前是否有別的猴子在逆向通過。請使用P/V 操作來解決該問題。
semaphore bridge,Smutex,Nmutex;
int count;//表示在橋上過橋的數量
bridge.value=1;//橋是臨界資源,爲表示不同方向互斥訪問
Smutex.value=1;//count是臨界資源,往南走的進程使用時得保護臨界區
Nmutex.value=1;//count是臨界資源,往北走的進程使用時得保護臨界區
count=0;//初始時過橋的猴子數量爲0
cobegin
//往南方向走的猴子進程
procedure South()
{
wait(Smutex);//保護臨界區
if(count==0)
wait(bridge);//封鎖橋,不讓反方向的進入橋
count++;
signal(Smutex);//保護臨界區
...
go through the bridge
...
wait(Smutex);//保護臨界區
count--;
if(count==0)
signal(bridge); //本方向的猴子走完了,釋放橋
signal(Smutex);//保護臨界區
}
//往北方向走的猴子進程
procedure North()
{
wait(Nmutex);//保護臨界區
if(count==0)
wait(bridge);//封鎖橋,不讓反方向的進入橋
count++;
signal(Nmutex);//保護臨界區
...
go through the bridge
...
wait(Nmutex);//保護臨界區
count--;
if(count==0)
signal(bridge); //本方向的猴子走完了,釋放橋
signal(Nmutex);//保護臨界區
}
coend
蘋果橘子問題
桌子上只有一個盤子,每次只能放入一種水果;爸爸專門向盤子裏放入蘋果,媽媽專門向盤子裏放入橘子,一個兒子專吃盤子中的橘子,一個女兒專吃盤子中的蘋果;試用信號量機制解決進程的互斥同步問題
//這裏分析,對於father和mother而言,盤子是臨界資源,同一時刻只能有一個往盤子裏放水果
//對於mother和son而言,存在着同步關係,mother放完orange等着son吃,son吃完等着mother放
//同理,對於father和daughter而言,存在同步關係
//這裏定義五個信號量,plate表示盤子是互斥的
//m,s用來表示mother和son交叉喚醒
//f,d用來表示father和daughter交叉喚醒
semaphore plate,m,s,f,d;
plate.value=1;
m.value=f.value=1;
s.value=d.value=0;
cobegin
procedure father()
{
while(1)
{
wait(plate);//判斷盤子是否可用,鎖定盤子
wait(f);//有點奇怪,感覺f在這裏很雞肋
...
put an apple into plate
...
signal(d);//通知daughter有apple可吃
signal(plate);//釋放盤子
}
}
procedure mother()
{
while(1)
{
wait(plate);//鎖定盤子
wait(m);//有點奇怪,感覺m在這裏很雞肋
...
put an orange into plate
...
signal(s);//通知son可以吃orange
signal(plate);//釋放盤子
}
}
procedure son()
{
while(1)
{
wait(s);//等待mother放好orange
...
get an orange from plate to eat
...
signal(m);//通知mother繼續放
}
}
procedure daughter()
{
while(1)
{
wait(d);//等待father放好apple
...
get an apple from plate to eat
...
signal(f);//通知father繼續放
}
}
coend
快餐廳問題
一個快餐廳有四類職員
(1)領班:接受顧客點菜
(2)廚師:準備顧客的飯菜
(3)打包工:將做好的飯菜打包
(4)出納員:收款並提交食品
每個職員可以被看作一個進程,請用信號量機制解決進程互斥同步問題
//P1->P2->P3->P4->P1這是一個同步問題
//定義四個信號量S1,S2,S3,S4
semaphore S1,S2,S3,S4;
S1.value=1;
S2.value=S3.value=S4.value=0;
cobegin
procedure P1
{
wait(S1);
...
接受顧客點菜
...
signal(S2);
}
procedure P2
{
wait(S2);
...
準備顧客的飯菜
...
signal(S3);
}
procedure P3
{
wait(S3);
...
將做好的飯菜打包
...
signal(S4);
}
procedure P4
{
wait(S4);
...
收款並提交食品
...
signal(S1);
}
coend