这是最大大小的缓冲区的问题。如果缓冲区已满,生产者将无法生产,如果缓冲区为空,使用者需要等待。显然,这种使用信号量的解决方案仅适用于单个生产者和消费者。有人可以解释一下为什么它不适用于多个生产者和消费者吗?
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()
答案 0 :(得分:1)
您的示例遇到了比赛条件。 您确实需要一些条件变量。不能仅使用信号量来确保多个生产者未写入完整的缓冲区或多个使用者未从空缓冲区读取。
单一生产者,单一消费者模型只是阻止了消费者直到生产者采取行动,然后才阻止生产者直到消费者采取行动。没有指示共享缓冲区为空还是已满。请注意,信号量计数与缓冲区的满或空条件不同。
答案 1 :(得分:1)