题目一:一组生产者和一组消费者进程共享一个初始为空,大小为n的缓冲区,只有缓冲区没有满的时候,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区未空时,消费者才可以从中取出消息,否则必须等待。由于缓冲区是临界资源,所必须互斥访问。
关系分析:
1.生产者和消费者对缓冲区的访问是互斥关系;
2.生产和消费者又有着同步关系,必须先生产再消费。
信号量设置:
1.设置mutex作为互斥信号量,让生产者和消费者可以互斥地访问缓冲区,且初始值为1;
2.设置信号量full来表示非空缓冲区的个数,初始值为0;信号量empty来表示空闲缓冲区的个数,初始值为n。
在写代码之前,要明确同步和互斥的代码有什么不同。
1.首先,生产者生产了数据消费者才能消费,所以用full信号量来控制生产者和消费者的这层同步关系,也就是在生产者进程的末尾要加上V(full),在消费者进程取走数据之前需要P(full)。
2.用信号量empty来控制生产者最多只可以往缓冲区中放入n个数据,超过n个数据,生产者进程就会被阻塞。
(在没写这篇博客之前,一直认为只需要full和empty这两个信号量中的一个就行,写到这里就明白了为什么一定要设置两个信号量了)
下面是对生产者和消费者问题的代码描述: