我有点困在多个消费者/生产者问题上。它出现在我的讲义中,但我完全不明白为什么单一的消费者/生产者方法不起作用。
1个消费者和1个生产者的典型方法如下:
Producer :
while(true)
emptyBuffers.P();
mutex.P();
buffer.insert(produced item);
mutex.V();
fullBuffers.V();
Consumer :
while(true)
fullBuffers.P();
mutex.P();
buffer.consume(consumed item);
mutex.V();
emptyBuffers.V();
如果我有超过1个生产者和/或超过1个消费者,为什么这不起作用?我到处寻找,但我找不到我理解的答案:s。
互斥信号量确保缓冲区中没有2个进程同时工作,所以如果有更多进程,我看不出这个属性可能会如何变化...
'解决方案'是您将互斥锁更改为ProducerMutex和ConsumerMutex。但现在这意味着生产者和消费者可以同时进入缓冲区,这是不允许的,对吗?
我真的没有得到这个:s
答案 0 :(得分:0)
这是http://en.wikipedia.org/wiki/Producer-consumer_problem(模数命名)中给出的解决方案。当然,这也说明你不需要1P / 1C版本的互斥锁(如果缓冲区只有1个插槽,那么它将是有效的)。但它也与http://cs.gmu.edu/cne/modules/ipc/purple/prodsem.html中给出的解决方案相同。
结论:我认为你得到的很好,而且没有人给你这个2-mutex“解决方案”不是。