使用我的想法,只需要一个信号量(除了互斥)

    n = 10
    mutex = 1

 producer:   //This is producer
    P(mutex)
    V(n)
    V(mutex)

 cosumer:    //This is consumer
    P(mutex)
    P(n)
    V(mutex)

下面用传统的两个信号量来实现它。
    n = 10
    empty = 0
    mutex = 1

 producer:   //This is producer
    P(empty)
    P(mutex)
    produce();
    V(mutex)
    V(n)

 consumer:    //This is consumer
    P(n)
    p(mutex)
    consume()
    V(mutex)
    V(empty)

最佳答案

在producer-consumer模式中,producer将项目放入一个有限大小的缓冲区,而consumer将项目从该缓冲区中移除。
理解这个模式的关键是理解生产者也是消费者——它使用空的缓冲槽。
信号量的目的是控制对计数资源的关键访问。由于缓冲区中的项是计数资源,而空缓冲区槽也是计数资源,因此需要两个信号量。
出现冗余,因为两个信号量计数不独立。它们的和保持不变,并且等于缓冲区大小。另外,两个线程队列也不是独立的。在任何时候,只有一个信号量会保存任何挂起的线程,因为永远不会有生产者和消费者同时等待。但是,冗余不足以消除其中一个信号量。
如果我理解你的意思,你所建议的构造将会失败,因为当缓冲区满的时候,生产者不会停止此外,如果使用者等待一个空缓冲区,则会阻止生产者到达其“v(n)”操作。
冗余确实表明,对于生产者-消费者对,更有效的同步可能是可能的,事实上,已经有许多其他人提出了建议。具体见'monitor'技术。

关于algorithm - 生产者-消费者,为什么不使用一个信号量实现它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19341465/

10-11 07:20
查看更多