信号量解决方案是否适用于多个生产者消费者?

时间:2018-12-11 03:53:05

标签: operating-system synchronization semaphore producer-consumer

这是最大大小的缓冲区的问题。如果缓冲区已满,生产者将无法生产,如果缓冲区为空,使用者需要等待。显然,这种使用信号量的解决方案仅适用于单个生产者和消费者。有人可以解释一下为什么它不适用于多个生产者和消费者吗?

has_space = Semaphore(max_num)
has_elements = Semaphore(0)
mutex = lock()

def producer():
  has_space.acquire()
  with mutex:
      # add elements
  has_elements.release()

def consumer():
  has_elements.acquire()
  with mutex:
      # retrieve elements
  has_space.release()

2 个答案:

答案 0 :(得分:1)

您的示例遇到了比赛条件。 您确实需要一些条件变量。不能仅使用信号量来确保多个生产者未写入完整的缓冲区或多个使用者未从空缓冲区读取。

单一生产者,单一消费者模型只是阻止了消费者直到生产者采取行动,然后才阻止生产者直到消费者采取行动。没有指示共享缓冲区为空还是已满。请注意,信号量计数与缓冲区的满或空条件不同。

答案 1 :(得分:1)

要让多个生产者工作,我们需要确保每个生产者都从缓冲池中使唯一的缓冲节点出队。 对于多个生产者-消费者要同步工作,您需要实现线程安全缓冲区队列,请检查here

多个生产者的实现-使用线程安全缓冲区队列的消费者可以here找到。