問題描述
桌子上有一只盤子吝镣,每次只能向其中放入一個水果。爸爸專向盤子中放蘋果泉蝌,媽媽專向盤子中放橘子歇万,兒子專等吃盤子中的橘子,女兒專等吃盤子中的蘋果勋陪。只有盤子為空時贪磺,爸爸或媽媽就可向盤子中放一個水果;僅當(dāng)盤子中有自己需要的水果時粥鞋,兒子或女兒可以從盤子中取出缘挽。
問題分析
關(guān)系分析。由每次只能向其中放入一只水果可知爸爸和媽媽是互斥關(guān)系呻粹。爸爸和女兒壕曼、媽媽和兒子是同步關(guān)系,而且這兩對進程必須連起來等浊。兒子和女兒之間沒有互斥和同步關(guān)系腮郊,因為他們是選擇條件執(zhí)行,不可能并發(fā)筹燕。
-
整理思路轧飞。這里有4個進程,實際上可以抽象為兩個生產(chǎn)者和兩個消費者被連接到大小為1的緩沖區(qū)上撒踪。
信號量設(shè)置过咬。首先設(shè)置信號量plate為互斥信號量,表示是否允許向盤子放入水果制妄,初值為1掸绞,表示最多只允許放入一個。信號量 apple表示盤子中是否有蘋果耕捞,初值為0衔掸,表示盤子為空烫幕,若apple=1,則表示可取敞映。信號量orange表示盤子中是否有橘子较曼,初值為0,表示盤子為空振愿,若orange=1捷犹,則可取。
解決方案
代碼描述如下:
semaphore plate=l, apple=0, orange=0;
dad() { //父親進程
while (1) {
prepare an apple;
P(plate) ; //互斥向盤中取埃疫、放水果
put the apple on the plate; //向盤中放蘋果
V(apple); //允許取蘋果
}
}
mom() { // 母親進程
while(1) {
prepare an orange;
P(plate); //互斥向盤中取伏恐、放水果
put the orange on the plate; //向盤中放橘子
V(orange); //允許取橘子
}
}
son(){ //兒子進程
while(1){
P(orange) ; //互斥向盤中取橘子
take an orange from the plate;
V(plate); //允許向盤中取孩哑、放水果
eat the orange;
}
}
daughter () { //女兒進程
while(1) {
P(apple); // 互斥向盤中取蘋果
take an apple from the plate;
V(plate); //運行向盤中取栓霜、放水果
eat the apple;
}
}