使用信号量和PV操作实现父亲、母亲、儿子、女儿4人,通过一个可以容纳1个水果的盘子进行削水果吃水果的活动协同。
问题描述:
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放 橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才 可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。 用PV操作实现上述过程。
问题分析:
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。
同步关系(一前一后):
父亲将苹果放入盘子后,女儿才能取苹果,设苹果数为apple,初始值为0
母亲将橘子放入盘子后,儿子才能取橘子,设橘子数为orange,初始值为0
只有盘子为空时,父亲或母亲才能放入水果,设盘子中水果数为plate,初始值为0
PV操作解答:
semaphore plate=1;//盘子还可以放多少个水果
semaphore orange=0;//盘子中橘子的数量
semaphore apple=0;//盘子中苹果的数量
dad(){
while(1){
准备一个苹果;
p(plate);//若plate=1,则可以访问盘子,进行放苹果操作,若plate=0,则盘子已经有水果,需在此等待
向盘子放苹果
V(apple);//唤醒女儿吃苹果
}
}
mom(){
while(1){
准备一个橘子;
P(plate);
向盘子放橘子;
V(orange);//唤醒儿子吃苹果
}
}
son(){
while(1){
P(orange);//若orange=0,则等待母亲放入水果
从盘子拿橘子;
V(plate);//橘子已被拿走,盘子可放水果数量加1,唤醒父亲母亲放入水果。
吃橘子;
}
}
daughter(){
while(){
P(apple);//若apple=0,则等待父亲放入水果
从盘子中拿苹果;
V(plate);//苹果已经被拿走,盘子可放水果数量加1,唤醒父亲母亲放入水果。
}
}