【问题标题】:Does the semaphore solution work for multiple producer consumer?信号量解决方案是否适用于多个生产者消费者?
【发布时间】:2018-12-11 03:53:04
【问题描述】:

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

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()

【问题讨论】:

  • 那不是 python,它是非常糟糕的伪代码。某些锁只在 2 个进程之间起作用

标签: operating-system synchronization semaphore producer-consumer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多