自选语言编写一个程序,模拟多个生产者进程和多个消费者进程并发执行,并采用信号量
时间: 2024-02-19 18:58:13 浏览: 175
语言:Python
下面是一个简单的多线程生产者和消费者程序,使用了Python的threading库和信号量来同步线程。其中,生产者线程会生成随机数,将其放入队列中,而消费者线程会从队列中获取随机数进行消费。
```python
import threading
import queue
import random
# 初始化队列和信号量
q = queue.Queue(maxsize=10)
lock = threading.Lock()
empty = threading.Semaphore(10)
full = threading.Semaphore(0)
# 生产者线程函数
def producer():
while True:
empty.acquire() # 等待空缓冲区
lock.acquire()
item = random.randint(1, 100)
q.put(item)
print("Producing item {}".format(item))
lock.release()
full.release() # 增加满缓冲区信号量
# 消费者线程函数
def consumer():
while True:
full.acquire() # 等待有数据可消费
lock.acquire()
item = q.get()
print("Consuming item {}".format(item))
lock.release()
empty.release() # 增加空缓冲区信号量
# 创建并启动生产者和消费者线程
for i in range(5):
threading.Thread(target=producer).start()
for i in range(5):
threading.Thread(target=consumer).start()
```
在上面的程序中,我们使用了一个队列作为生产者和消费者之间的缓冲区。生产者线程将生成的随机数放入队列中,而消费者线程则从队列中获取随机数进行消费。为了实现线程间的同步,我们使用了Python的信号量机制。信号量允许线程在共享资源上进行互斥访问,从而避免了线程之间的竞争和冲突。在我们的程序中,我们使用了两个信号量:empty和full。empty表示当前空闲缓冲区的数量,full表示当前已经填充缓冲区的数量。当生产者线程生成一个随机数时,它会首先获取empty信号量,表示等待空闲缓冲区的出现。然后,它会获取锁,往队列中添加随机数,并打印出当前生产的数值。最后,它会释放锁,并增加full信号量,表示填充缓冲区的数量增加了一个。当消费者线程从队列中获取一个随机数时,它会首先获取full信号量,表示等待有数据可消费。然后,它会获取锁,从队列中获取随机数,并打印出当前消费的数值。最后,它会释放锁,并增加empty信号量,表示空闲缓冲区的数量增加了一个。
阅读全文