併發進程同步

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);
		開車門;
		上下乘客;
	}
}

未完待續。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章