具有有界缓冲区的生产者/消费者,具有信号量的多个生产者/消费者

时间:2012-01-22 13:24:18

标签: synchronization mutex semaphore consumer producer

我有点困在多个消费者/生产者问题上。它出现在我的讲义中,但我完全不明白为什么单一的消费者/生产者方法不起作用。

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

1 个答案:

答案 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“解决方案”不是。