利用记录型信号量解决生产者消费者问题具体代码
时间: 2024-10-24 08:09:49 浏览: 27
利用记录型信号量解决生产者-消费者问题.doc
在解决生产者消费者问题时,我们可以利用记录型信号量(也称为条件变量、信号灯)来同步生产者和消费者的操作。这里我们用Python的`threading`库为例,假设有一个缓冲区,生产者添加物品到缓冲区,消费者从缓冲区取出物品。以下是使用记录型信号量的一个简单示例:
```python
import threading
from queue import Queue
import time
# 初始化一个空队列作为缓冲区
buffer = Queue()
# 创建两个信号量,一个表示缓冲区满的状态(countdown),另一个表示缓冲区空的状态(countup)
empty_semaphore = threading.Semaphore(0) # 表示缓冲区空
full_semaphore = threading.Semaphore(1) # 表示缓冲区满
def producer(buffer, empty_semaphore):
for i in range(5): # 生产5个物品
empty_semaphore.acquire() # 当缓冲区为空时,生产者获取信号
buffer.put(i)
full_semaphore.release() # 放入物品后释放信号,允许下一个消费者进入
def consumer(buffer, full_semaphore):
for _ in range(5): # 消费5个物品
full_semaphore.acquire() # 当缓冲区满时,消费者获取信号
item = buffer.get() # 取出并消费物品
print(f"Consumed {item}")
empty_semaphore.release() # 消费完后释放信号,允许下一个生产者加入
if __name__ == "__main__":
producer_thread = threading.Thread(target=producer, args=(buffer, empty_semaphore))
consumer_thread = threading.Thread(target=consumer, args=(buffer, full_semaphore))
producer_thread.start()
consumer_thread.start()
producer_thread.join()
consumer_thread.join()
print("Both threads finished.")
阅读全文