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

Does the semaphore solution work for multiple 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()

您的示例遇到竞争条件。 您确实需要一些类似于条件变量的东西。无法仅使用信号量来确保多个生产者不会写入满缓冲区或多个消费者不会从空缓冲区中读取。

单一生产者、单一消费者模型简单地阻塞消费者直到生产者行动,然后阻塞生产者直到消费者行动。没有迹象表明共享缓冲区是空的还是满的。请注意,信号量计数与缓冲区的满或空条件不同。

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

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