,创建 5 个线程,其中两个线程为生产者线程, 3 个线程为消费者线程。一个生产者线程试图不断地在一个缓冲区中写入大写英 文字母,另一个生产者线程试图不断地在缓冲区中写入小写英文字母。3 个消费 者不断地从缓冲区中读取一个字符并输出。为了使得程序的输出易于看到结果, 可分别在生产者和消费者线区程的合适的位置加入一些随机睡眠时间。缓冲区的 大小为 10。
时间: 2023-06-18 12:08:14 浏览: 83
以下是一个可能的解法,使用 Python 的 threading 和 queue 模块实现:
```python
import threading
import queue
import random
import string
BUF_SIZE = 10 # 缓冲区大小
buf = queue.Queue(BUF_SIZE) # 创建缓冲区队列
lock = threading.Lock() # 创建锁对象
# 生产者线程1,写入大写字母
def producer_upper():
while True:
with lock:
if not buf.full():
c = random.choice(string.ascii_uppercase)
buf.put(c)
print(f"生产者1写入{c}")
time.sleep(random.random()) # 随机睡眠一段时间
# 生产者线程2,写入小写字母
def producer_lower():
while True:
with lock:
if not buf.full():
c = random.choice(string.ascii_lowercase)
buf.put(c)
print(f"生产者2写入{c}")
time.sleep(random.random()) # 随机睡眠一段时间
# 消费者线程,读取并输出缓冲区中的字符
def consumer():
while True:
with lock:
if not buf.empty():
c = buf.get()
print(f"消费者读取{c}")
time.sleep(random.random()) # 随机睡眠一段时间
# 创建并启动线程
threads = []
threads.append(threading.Thread(target=producer_upper))
threads.append(threading.Thread(target=producer_lower))
for i in range(3):
threads.append(threading.Thread(target=consumer))
for t in threads:
t.start()
```
在程序中,我们使用了 Python 的随机数模块 `random` 和字符串模块 `string`,分别用于生成随机字母和获取字母表。缓冲区队列使用了 Python 的 `queue` 模块中的 `Queue` 类,其具有线程安全的特性,可以避免多线程操作时的竞态条件问题。使用锁 `lock` 可以保证在多线程操作缓冲区时的互斥性。
在生产者和消费者线程的代码中,我们使用了 with 语句来获取锁,以保证操作缓冲区时的互斥性。在每个生产者线程和消费者线程中,我们都加入了一个随机的睡眠时间,以模拟生产者和消费者的生产和消费速度的不确定性。最后,我们创建了 5 个线程并启动它们。
阅读全文