题目描述:
M个生产者进程和 N个消费者进程共享大小为 K 的缓冲区,遵循规则如下:
(1) 进程之间必须以互斥方式访问缓冲区;
(2) 对每 1 条放入缓冲区的数据,所有消费者都必须接收 1 次;
(3) 缓冲区满时,生产者必须阻塞;
(4) 缓冲区空时,消费者必须阻塞。
请用 P、V 操作实现其同步过程,须说明信号量含义。
题目分析:(以下仅是个人的做法,因为没有在网上找到答案,所以按照我自己的思路写一个,仅供参考!)
分析:这道题难点在于,对每 1 条放入缓冲区的数据,所有消费者都必须接收 1 次;所以我的示意图中显示,有K个缓冲区,一个生产者每一次生产产品都会把一个缓冲区填满。然后所有消费者都必须消费一次才会释放这个缓冲区为重新可用的。所以我的思路是把每个缓冲区划分成N个小的缓冲区。N个消费者,每个消费者单独消费自己的那一个小的缓冲区,这里就需要一个count来计数,每有一个消费者消费那么就count++;如果count == N,便说明所有消费者都接受过这条数据了,所以可以释放当前的缓冲区了。同样K个缓冲区是一样的操作过程。需要设置一个mutex来保证所有进程互斥访问。
参考伪代码如下:
【注】伪代码写的不是很标准,看懂意思就好
semaphore buffer[