生产者-消费者问题(计算机系统中的许多问题都可归结为此问题)描述如下:生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。 编写程序模拟多个生产者和多个消费者共享缓冲池的生产和消费过程。 要求: 1. 设计信号量用于进行生产者-消费者、生产者-生产者、消费者-消费者之间的同步控制; 2. 创建多个(不少于5个)进程或者线程模拟生产者和消费者; 3. 缓冲池大小定义在10-20,缓冲块中的产品为数据; 4. 程序运行结果能实时显示缓冲池中生产和消费产品的过程,包括断点、推进时间、次序等,编程语言可选用C、C++、Java或者Python。
时间: 2024-02-13 07:04:57 浏览: 150
好的,这是一个经典的生产者-消费者问题,需要使用信号量来实现多个进程或线程之间的同步和互斥。以下是一个可能的解决方案,使用 Python 编写。
```python
import threading
import time
import random
# 缓冲池大小定义在10-20之间
BUFFER_SIZE = 15
# 缓冲池
buffer = []
# 信号量
mutex = threading.Semaphore(1)
empty = threading.Semaphore(BUFFER_SIZE)
full = threading.Semaphore(0)
# 生产者线程
class ProducerThread(threading.Thread):
def run(self):
global buffer
while True:
# 等待空缓冲块
empty.acquire()
# 获取互斥锁
mutex.acquire()
# 生产产品
item = random.randint(1, 100)
buffer.append(item)
print(f"Produced item {item}, buffer size = {len(buffer)}")
# 释放互斥锁
mutex.release()
# 发送满信号量
full.release()
# 推迟一定时间,模拟生产过程
time.sleep(random.random())
# 消费者线程
class ConsumerThread(threading.Thread):
def run(self):
global buffer
while True:
# 等待满缓冲块
full.acquire()
# 获取互斥锁
mutex.acquire()
# 消费产品
item = buffer.pop(0)
print(f"Consumed item {item}, buffer size = {len(buffer)}")
# 释放互斥锁
mutex.release()
# 发送空信号量
empty.release()
# 推迟一定时间,模拟消费过程
time.sleep(random.random())
# 创建多个生产者和消费者线程
for i in range(5):
ProducerThread().start()
for i in range(5):
ConsumerThread().start()
```
在上面的代码中,我们使用了 Python 中的 threading 模块来创建多个生产者和消费者线程。每个线程都是 ProducerThread 或 ConsumerThread 类的实例,它们都继承自 threading.Thread 类,并重写了 run() 方法来实现线程的主体逻辑。
在 run() 方法中,生产者线程首先等待空缓冲块,然后获取互斥锁,生产一个随机数作为产品,并将其添加到缓冲池中。接着释放互斥锁,发送满信号量,并推迟一定时间,模拟生产过程。消费者线程的逻辑类似,只是等待满缓冲块,消费一个产品,并发送空信号量。需要注意的是,缓冲池和信号量都是全局变量,需要使用 global 声明来在线程中访问它们。
最后,我们创建了5个生产者和5个消费者线程,并启动它们。运行程序后,可以看到实时显示缓冲池中生产和消费产品的过程,包括断点、推进时间、次序等。
阅读全文