0

我有点卡在多个消费者/生产者问题上。它出现在我的讲义中,但我根本无法理解为什么单一的消费者/生产者方法行不通。

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

4

1 回答 1

0

这是http://en.wikipedia.org/wiki/Producer-consumer_problem(模命名)中给出的解决方案。当然,这也表明您不需要 1P/1C 版本的互斥锁(如果缓冲区只有 1 个插槽,这将是有效的)。但它也与http://cs.gmu.edu/cne/modules/ipc/purple/prodsem.html中给出的解决方案相同。

底线:我认为你得到这个很好,而谁给你这个 2-mutex“解决方案”不是。

于 2012-01-22T14:10:28.657 回答