1.多生产者多消费者问题:
(1)问题描述:桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。
用PV操作实现上述过程。
(2)问题分析:
-
互斥关系:(mutex = 1)
对缓冲区(盘子)的访问要互斥地进行。 -
同步关系(一前一后):
-
父亲将苹果放入盘子后,女儿才能取苹果。
-
母亲将橘子放入盘子后,儿子才能取橘子。
-
只有盘子为空时,父亲或母亲才能放入水果。(盘子为空这个事件,由儿子或女儿触发,事件发生后父亲或母亲才允许放入水果)
(3)如何实现:
semaphore mutex = 1; // 实现互斥访问盘子(缓冲区)
semaphore apple = 0; // 盘子中有几个苹果
semaphore orange = 0; // 盘子中有几个橘子
semaphore plate = 1; // 盘子中还可以放多少个水果
问题:可不可以不用互斥信号量?
结论:即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象
原因在于:本题中的缓冲区大小为1,在任何时刻,apple、 orange、 plate 三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。
当缓冲区数量大于1时,就必须设置互斥信号量。
其余的细节与上一篇类似。(比如"前V后P",造成死锁)