有两个生产者:偶数生产者及奇数生产者,其中偶数生产者责任生产顺序0,2,4,6,8…,奇数生产者责任生1,3,5,7…。数据收集者责任打包一个数据,每个数据由一个偶数和一个奇数组成,并且和一个数据中的奇偶数相差1,比如0和1组成一个偶数,2和3构成一个数据。因此数据收集者必须承担责任等待当前轮次奇偶数据都到了,才能生成一个数据,并放入队列。消费者每次取出一个数据,并打印。偶数生成者和奇数生成人每次生产一个数后随机休眠(sleep)一段时间,范围是:100ms-150ms。
时间: 2024-02-21 14:00:45 浏览: 132
C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计
5星 · 资源好评率100%
好的,这是一个经典的生产者消费者问题,我们可以使用多线程和队列来解决。具体实现如下:
首先,我们需要创建三个线程:偶数生产者线程、奇数生产者线程和数据收集者线程。还需要一个缓存队列,用于存放数据,这里我们使用Python内置的queue.Queue来实现。
偶数生产者线程可以使用一个循环来实现,每次生产一个偶数后随机休眠一段时间,将生产的偶数放入缓存队列中。奇数生产者线程同理。
数据收集者线程需要等待当前轮次的奇偶数据都到了,才能生产一个数据,并放入缓存队列中。我们可以使用一个变量来记录当前轮次的奇偶数据是否都已经到了,当都到了之后,就可以将奇偶数据合并成一个数据,放入缓存队列中。
消费者线程可以使用一个循环来实现,每次从缓存队列中取出一个数据,并打印。
具体代码实现如下:
```python
import queue
import threading
import time
import random
# 缓存队列
data_queue = queue.Queue()
# 当前轮次奇偶数据是否都已经到了
is_even_ready = False
is_odd_ready = False
# 当前轮次的奇偶数
even_num = None
odd_num = None
# 偶数生产者线程
def even_producer():
global is_even_ready, even_num
while True:
time.sleep(random.uniform(0.1, 0.15)) # 随机休眠
even_num = even_num + 2 if even_num is not None else 0 # 生产偶数
data_queue.put(even_num) # 将偶数放入缓存队列
is_even_ready = True # 偶数已准备好
if is_odd_ready: # 如果奇数也已准备好,则生成一个数据
data = (even_num, odd_num)
data_queue.put(data) # 将数据放入缓存队列
is_even_ready, is_odd_ready = False, False # 重置标志位
# 奇数生产者线程
def odd_producer():
global is_odd_ready, odd_num
while True:
time.sleep(random.uniform(0.1, 0.15)) # 随机休眠
odd_num = odd_num + 2 if odd_num is not None else 1 # 生产奇数
data_queue.put(odd_num) # 将奇数放入缓存队列
is_odd_ready = True # 奇数已准备好
if is_even_ready: # 如果偶数也已准备好,则生成一个数据
data = (even_num, odd_num)
data_queue.put(data) # 将数据放入缓存队列
is_even_ready, is_odd_ready = False, False # 重置标志位
# 数据收集者线程
def data_collector():
global is_even_ready, is_odd_ready, even_num, odd_num
while True:
if not is_even_ready or not is_odd_ready: # 如果奇偶数据还没准备好,则继续等待
continue
data = (even_num, odd_num)
data_queue.put(data) # 将数据放入缓存队列
is_even_ready, is_odd_ready = False, False # 重置标志位
# 消费者线程
def consumer():
while True:
data = data_queue.get() # 从缓存队列中取出一个数据
print(data) # 打印数据
# 创建偶数生产者、奇数生产者、数据收集者和消费者线程
even_num = None
odd_num = None
even_thread = threading.Thread(target=even_producer)
odd_thread = threading.Thread(target=odd_producer)
data_thread = threading.Thread(target=data_collector)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
even_thread.start()
odd_thread.start()
data_thread.start()
consumer_thread.start()
```
这样,我们就成功地实现了一个多线程的偶数奇数生产者和数据收集者模型。
阅读全文