桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放橘子,儿子专等着吃盘子中的句子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。
由于盘子里的容量是有限的,盘子只能放一个水果,所以那么如果父亲在盘子里放了一个苹果,而女儿还没有来得及取出苹果的时候,此时母亲尝试把橘子放到盘子里去,因为盘子里只能放一个水果,此时母亲放橘子的行为会被阻塞;此时儿子如果想要拿盘子里的水果,而苹果不是儿子想要的,那么此时儿子的行为也该被阻塞。
类似于生产者消费者进程,可以把盘子看作一个大小为1的缓冲区,把父亲母亲分别看作两个生产者,把儿子女儿分别看成两个消费者。
对于缓冲区的访问一般需要互斥的访问。
互斥:在临界区前后分别PV
互斥关系:(mutex=1)
同步:前V后P
同步关系(一前一后):
- 父亲将苹果放入盘子后,女儿才能取苹果
- 母亲将橘子放入盘子后,儿子才能取橘子
- 只有盘子为空时,父亲或母亲才能放入水果。(盘子为空这个事件既可以由儿子触发也可以由女儿触发)
因为父亲进程需要把苹果放进盘子,女儿才可以拿到,因此设置一个同步信号量apple,用来实现同步关系,由于刚开始盘子里是没有苹果的,所以我们设置apple=0,只有父亲执行V操作后,女儿执行的P操作才不会被阻塞。同理为母亲进程设置orange=0;另外只有盘子为空的时候,父亲和母亲才可以放入水果,而刚开始盘子本来就是空的,所以父亲和母亲在刚开始就可以向盘子里放入一个水果,这一对同步关系需要设置一个信号量plate=1来表示此时盘子是否为空。