使用线程实现生产者消费者问题。 生产者生产物品用于消费者消费。生产者生产的商品只可以保存2个。生产者生产5次,消费者全部消费。消费者5次消费后死亡,生产者检测到消费者死亡后跟随死亡,并清空所有产品。
时间: 2023-12-30 10:03:06 浏览: 76
以下是使用Python的标准库threading实现生产者消费者问题的代码:
```python
import threading
import time
# 生产者生产的物品
products = []
# 互斥锁,用来控制对products的访问
lock = threading.Lock()
# 条件变量,用来控制生产者和消费者的同步
condition = threading.Condition()
# 生产者线程
class ProducerThread(threading.Thread):
def run(self):
global products
for i in range(5):
# 获取互斥锁
lock.acquire()
while len(products) == 2:
# 如果products已满,则等待
condition.wait()
# 生产物品
products.append("product")
print("Producer produced 1 product, total products: ", len(products))
# 释放互斥锁
lock.release()
# 通知消费者
condition.notify()
# 消费者线程
class ConsumerThread(threading.Thread):
def run(self):
global products
for i in range(5):
# 获取互斥锁
lock.acquire()
while len(products) == 0:
# 如果products为空,则等待
condition.wait()
# 消费物品
products.pop()
print("Consumer consumed 1 product, total products: ", len(products))
# 释放互斥锁
lock.release()
# 通知生产者
condition.notify()
# 消费者死亡,通知生产者结束
condition.notifyAll()
# 创建生产者和消费者线程并启动
producer_thread = ProducerThread()
consumer_thread = ConsumerThread()
producer_thread.start()
consumer_thread.start()
# 等待消费者线程结束
consumer_thread.join()
# 清空所有产品
lock.acquire()
products = []
lock.release()
# 生产者检测到消费者死亡后跟随死亡
producer_thread.join()
```
在上述代码中,生产者线程和消费者线程分别通过继承threading.Thread类来实现。生产者线程在每次生产物品时,获取互斥锁并检查products是否已满,如果已满则等待条件变量,否则生产物品并通知所有等待该条件变量的线程。消费者线程在每次消费物品时,获取互斥锁并检查products是否为空,如果为空则等待条件变量,否则消费物品并通知所有等待该条件变量的线程。在消费者线程结束后,生产者线程通过检测条件变量判断是否需要结束,并清空所有产品。
阅读全文