编程实现生产者-消费者进程的同步与互斥,题目要求: 1、至少支持两个生产者和两个消费者; 2、每次只能有一个生产者或消费者进入仓库; 3、仓库满时生产者不能进入仓库,仓库空时消费者不能进入仓库。
时间: 2023-12-30 18:05:52 浏览: 54
可以使用线程和锁来实现生产者-消费者进程的同步与互斥。以下是一个简单的实现示例:
```python
import threading
# 仓库的最大容量
MAX_NUM = 10
# 初始化仓库为空
goods = []
lock = threading.Lock()
# 生产者线程
class ProducerThread(threading.Thread):
def run(self):
global goods
while True:
# 获取锁
lock.acquire()
# 如果仓库已满,等待
if len(goods) == MAX_NUM:
lock.release()
continue
# 向仓库中添加商品
goods.append(1)
print("生产者%s生产了一个商品,当前仓库商品数量为%d" % (self.name, len(goods)))
# 释放锁
lock.release()
# 消费者线程
class ConsumerThread(threading.Thread):
def run(self):
global goods
while True:
# 获取锁
lock.acquire()
# 如果仓库为空,等待
if len(goods) == 0:
lock.release()
continue
# 从仓库中取出一个商品
goods.pop()
print("消费者%s消费了一个商品,当前仓库商品数量为%d" % (self.name, len(goods)))
# 释放锁
lock.release()
# 创建两个生产者线程和两个消费者线程
p1 = ProducerThread()
p2 = ProducerThread()
c1 = ConsumerThread()
c2 = ConsumerThread()
# 启动线程
p1.start()
p2.start()
c1.start()
c2.start()
```
这个示例使用了一个全局的列表 `goods` 来表示仓库中的商品数量。在生产者线程中,每次生产一个商品时,需要先获取锁,确保同一时间只有一个线程可以修改仓库的内容。如果仓库已满,则需要释放锁并等待。在消费者线程中,每次消费一个商品时,也需要先获取锁。如果仓库为空,则需要释放锁并等待。
需要注意的是,在多线程编程中,由于线程执行的顺序不确定,因此可能会出现一些意想不到的情况。例如,在上面的示例中,生产者线程生产一个商品后,可能还没有来得及释放锁,消费者线程就已经获取了锁并消费了这个商品。因此,在编写多线程程序时,需要仔细考虑线程之间的同步问题,避免出现竞态条件等问题。
阅读全文