【问题标题】:Producer / Consumer with Bounded Buffer, multiple producers/consumers with Semaphores有界缓冲区的生产者/消费者,信号量的多个生产者/消费者
【发布时间】:2012-01-22 13:24:17
【问题描述】:

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

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

【问题讨论】:

    标签: synchronization mutex semaphore consumer producer


    【解决方案1】:

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

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

    【讨论】:

    • 很遗憾,那位教授恰好会在我的考试中给我评分 :)。尽管如此,我很高兴,根据你的说法,我没有在这里遗漏一些基本方面。谢谢
    • 至少现在你有一些引用可以引用(除了我:))
    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2016-06-21
    • 2014-05-13
    • 2016-06-29
    • 1970-01-01
    • 2018-05-05
    • 2015-07-03
    • 2017-04-07
    相关资源
    最近更新 更多