1,桌上有一空盤,允許存放一隻水果。爸爸可向盤中放蘋果也可向盤中放桔子,兒子專等喫盤中的桔子,女兒專等喫盤中的蘋果。規定當盤空時一次只能放一隻水果供喫者取用,請用P、V原語實現爸爸、兒子、女兒三個併發進程的同步。
解:設三個信號量S、So、Sa;信號量S表示盤子是否爲空,其初值爲1;信號量So表示盤中是否有桔子,其初值爲0;信號量Sa表示盤中是否有蘋果,其初值爲0。同步描述如下:
int S=1;
int Sa=0;
int So=0;
main(){
begin
father();
son();
daughter();
end
}
father(){
while(1){
P(S);//將水果放入盤中
if(放入盤中的是桔子){
V(So);
}else{
V(Sa);
}
}
}
son(){
while(1){
P(So);//從盤中取出桔子
V(S);//喫橘子
}
}
daughter(){
while(1){
P(Sa);//從盤中取出蘋果
V(S);//喫蘋果
}
}
2,設公共汽車上,司機和售票員的活動分別是:
在汽車不斷地到站、停車、行駛過程中,這兩個活動有什麼同步關係?用信號量和P、V操作實現他們的同步。
解:司機和售票員的活動得同步,如下所示
司機 | 售票員 |
---|---|
啓動車輛 | 關車門 |
正常行車 | 售票 |
到站停車 | 開車門 |
設兩個信號量S1,S2;
S1表示是否運行司機啓動汽車,其初值爲0
S2表示是否運行售票員開門,其初值爲0
用P、V原語描述如下:
int S1=0;
int S2=0;
main(){
begin
driver();
busman();
end
}
driver(){
while(1){
P(S1);
啓動車輛;
正常行車;
到站停車;
V(S2);
}
}
busman(){
while(1){
關車門;
V(S1);
售票;
P(S2);
開車門;
上下乘客;
}
}
未完待續。。。