利用线程编写程序,实现对生产者消费者问题的模拟。
时间: 2023-05-27 20:03:29 浏览: 121
(Linux C)利用多进程或多线程模拟实现生产者/消费者问题
以下是一个简单的生产者消费者模型的示例,使用Python多线程编写:
```python
import threading
import time
queue = [] # 共享队列
MAX_NUM = 10 # 最大队列长度
condition = threading.Condition() # 条件锁,用于线程同步
# 生产者线程
class ProducerThread(threading.Thread):
def run(self):
nums = range(5) # 生产5个物品
global queue
while True:
condition.acquire() # 加锁
if len(queue) == MAX_NUM: # 如果队列已满,等待消费者取出物品
print("Queue is full, producer is waiting")
condition.wait()
print("Space in queue, Consumer notified Producer")
num = nums.pop() # 生产一个物品
queue.append(num) # 将物品加入队列
print("Produced", num)
condition.notify() # 通知消费者
condition.release() # 解锁
time.sleep(1) # 生产物品的时间间隔
# 消费者线程
class ConsumerThread(threading.Thread):
def run(self):
global queue
while True:
condition.acquire() # 加锁
if not queue: # 如果队列为空,等待生产者生产物品
print("Queue is empty, consumer is waiting")
condition.wait()
print("Producer added something to queue and notified Consumer")
num = queue.pop(0) # 取出队列中第一个物品进行消费
print("Consumed", num)
condition.notify() # 通知生产者
condition.release() # 解锁
time.sleep(2) # 消费物品的时间间隔
ProducerThread().start() # 启动生产者线程
ConsumerThread().start() # 启动消费者线程
```
上述代码定义了两个线程,一个生产者线程和一个消费者线程,使用一个共享队列来模拟生产者和消费者的交互。
生产者线程从一个包含5个数字的序列中生成物品,并将其添加到队列中。如果队列已满,生产者线程将等待消费者线程占用一个位置,然后再次尝试添加。如果生产者线程成功添加物品,它将通过条件变量通知消费者线程。
消费者线程从队列中取出第一个物品进行消费,并将其从队列中移除。如果队列为空,消费者线程将等待生产者添加物品并通知。消费者线程完成消费后,会通过条件变量通知生产者线程。
注意,这里使用了条件锁condition来协调生产者和消费者之间的线程通信。如果队列已满,生产者线程调用wait()方法等待,直到其他线程调用notify()方法才被唤醒。同样,如果队列为空,消费者线程也会等待,直到其他线程调用notify()方法才会被唤醒。
通过使用条件锁,我们实现了线程间的同步与通信,避免了生产者和消费者之间的竞态条件,从而保证了程序的正确性。
阅读全文