在Linux系统下,用信号量机制编程实现生产者消费者问题。 [截图给出代码,结果和调试过程]
时间: 2024-10-08 20:02:20 浏览: 13
在Linux系统下,我们可以利用信号量(Semaphore)来解决生产者-消费者(Producer-Consumer)问题。这是一种同步原语,它允许在多任务环境下控制资源访问的数量。以下是简单的生产者消费者问题的Python代码示例,使用`semaphore`模块(实际上是`threading`库中的`Semaphore`对象):
```python
import threading
import time
from random import randint
# 初始化信号量(缓冲区大小)
BUFFER_SIZE = 5
empty_sema = threading.Semaphore(BUFFER_SIZE) # 表示空缓冲区
full_sema = threading.Semaphore(0) # 表示满缓冲区
def producer(consumer_queue):
while True:
empty_sema.acquire() # 当缓冲区为空时,获取空信号量
product = 'Product ' + str(randint(1, 10))
print(f"Producer produced {product}")
consumer_queue.put(product)
full_sema.release() # 将产品放入缓冲区并释放满信号量
def consumer(consumer_queue):
while True:
full_sema.acquire() # 当缓冲区满时,获取满信号量
product = consumer_queue.get()
print(f"Consumer consumed {product}")
empty_sema.release() # 消费完产品,将缓冲区放回空状态
consumer_queue = []
for _ in range(2): # 创建两个线程,一个生产者一个消费者
t = threading.Thread(target=lambda: producer_consumer_loop(producer, consumer_queue))
t.start()
def producer_consumer_loop(func1, func2):
func1(func2)
```
在这个例子中,`empty_sema`用于表示缓冲区是否为空,当缓冲区不满(剩余位置大于0)时,`acquire()`会成功;而`full_sema`则是表示缓冲区是否已满,当缓冲区满时,`acquire()`会被阻塞直到有生产者减缓其速度。通过这种方式,生产者和消费者可以协调工作,避免了数据竞争。