题目描述
桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专门向盘子里面放苹果,妈妈专门向盘子里面放橘子;只有盘子为空时,爸爸或妈妈才可以向其中放入水果;仅当盘子里有自己需要的水果时,儿子或女儿才会从盘子里面取出。
关系分析
1.爸爸和妈妈是互斥关系;
2.爸爸和女儿是同步关系,妈妈和儿子也是同步关系;
3.儿子和女儿之间没有同步与互斥关系,因为儿子和女儿是选择条件执行,不可能并发。
思路
该过程可以抽象为两个生产者、两个消费者和一个缓冲区的问题
代码
semaphore mutex = 1; //对盘子的互斥访问
semaphore plate = 1; //缓冲区的个数
semaphore apple = 1;
semaphore orange = 1;
father(){
while(true){
prepare an apple;
P(plate); //消耗掉一个缓冲区
P(mutex); //互斥地访问缓冲区
put an apple on the plate; //往缓冲区里放东西
V(apple); //告诉女儿进程盘子里面有苹果了
V(mutex); //释放缓冲区的使用权
}
}
daughter(){
while(true){
P(apple); //告诉父亲进程可以继续往盘子里面放苹果了
P(mutex); //互斥地从盘子里取出食物
take an apple from the plate;
V(plate); //释放了一个缓冲区
V(mutex); //释放了对缓冲区的独占
}
}
mom(){
while(true){
P(plate); //消耗一个缓冲区
P(mutex); //互斥地访问缓冲区
put an orange to the plate; //往缓冲区放橘子
V(orange); //告诉儿子有橘子了
V(mutex); //释放对缓冲区的独占
}
}
son(){
while(true){
P(orange); //告诉妈妈可以放橘子啦
P(mutex);
eat the orange;
V(mutex);
V(plate); //释放缓冲区
}
}
注意
在这个多生产者多消费者问题中,可不可以不使用互斥信号量?
是可以的,可以用plate = 1来使爸爸和妈妈两个进程之间互斥地访问信号量,注意只有plate的值为1的时候才可以这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)