2.3.7 多生产者多消费者问题
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。
不同于一个(类)生产者一个(类)消费者问题,本题目中含有多个生产者多个消费者,但是临界资源还是1且为互斥共享。很明显这个题目的互斥关系为对盘子的访问要互斥进行;这个题目的同步关系有三个,1. 父
亲将苹果放入盘子后,女儿才能取苹果 2. 母亲将橘子放入盘子后,儿子才能取橘子 3. 只有在儿子或者女儿取出了水果之后父母才能放水果。用前驱图表示同步关系如下:
亲将苹果放入盘子后,女儿才能取苹果 2. 母亲将橘子放入盘子后,儿子才能取橘子 3. 只有在儿子或者女儿取出了水果之后父母才能放水果。用前驱图表示同步关系如下:

semaphore mutex = 1; //实现互斥访问盘子(缓冲区)
semaphore apple = 0; //盘子中有几个苹果
semaphore orange = 0; //盘子中有几个橘子
semaphore plate = 1; //盘子中还可以放多少个水果
dad (){
while(1){
准备一个苹果;
P(plate);
P(mutex);
把苹果放入盘子;
V(mutex);
V(apple);
}
}
mom (){
while(1){
准备一个橘子;
P(plate);
P(mutex);
把橘子放入盘子;
V(mutex);
V(orange);
}
}
daughter (){
while(1){
P(apple);
P(mutex);
从盘中取出苹果;
V(mutex);
V(plate);
吃掉苹果;
}
}
son (){
while(1){
P(orange);
P(mutex);
从盘中取出橘子;
V(mutex);
V(plate);
吃掉橘子;
}
}
可能有的同学会问为什么设置了一个mutex=1还要再有一个plate=1呢?mutex完成的任务是保证互斥,其值并无实际意义;plate代表的是缓冲区的大小,可以随着题目条件而改变。顺便一提,其实在本题中mutex可以不要,因为在任何时候apple、orange、plate 三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。但是再平常的时候我们还是写上互斥信号量比较好。
版权声明:本文为qq_40608137原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。