生产者 - 消费者,为什么不用ONE信号量实现它?

时间:2013-10-13 03:11:59

标签: algorithm operating-system

使用我的想法只接受一个信号量(除了互斥锁)

    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)

1 个答案:

答案 0 :(得分:2)

在生产者 - 消费者模式中,生产者将物品放入有限大小的缓冲区中,消费者从该缓冲区中移除物品。

理解模式的关键是要理解生产者也是消费者 - 它消耗空的缓冲槽。

信号量的目的是控制对计算资源的关键访问。由于缓冲区中的项是计数资源而空缓冲区槽也是计数资源,因此需要两个信号量。

出现冗余,因为两个信号量计数不是独立的。它们的总和保持不变,等于缓冲区大小。此外,两个线程队列不是独立的。在任何时候,只有一个信号量将保持任何被挂起的线程,因为永远不会有生产者和消费者同时等待。但是,冗余不够完整,无法消除其中一个信号量。

如果我理解你,你建议的结构会失败,因为当缓冲区已满时,生产者不会停止。此外,如果消费者等待空缓冲区,它会阻止生产者达到其'V(n)'操作。

冗余确实表明生产者 - 消费者对可能更有效的同步,并且确实已经提出了许多其他的同步。特别参见'monitor'技术。