2.3.7 多生产者-多消费者
知识来源: B站王道考研
问题描述
桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子放入苹果,妈妈专门放入橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放入一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。
// 实现互斥访问盘子(缓冲区)
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);
吃掉橘子;
}
}
本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。
如果容量为2,则不满足。