semWait 和 semSignal

semWait 和 semSignal 是用于处理信号量的操作。信号量是用来控制对共享资源的访问的同步机制,确保在多个进程或线程之间对共享资源的访问不会发生冲突。

semWait 操作会尝试获取信号量,如果信号量的值大于等于 1,则将信号量的值减 1,并继续执行。如果信号量的值为 0,则进程或线程会被阻塞,直到信号量的值大于等于 1。

semSignal 操作会增加信号量的值,通常加 1。如果有其他被 semWait 阻塞的进程或线程,会解除其阻塞状态,使其可以继续执行。

举例来说,考虑一个生产者-消费者的问题,生产者和消费者共享一个有限的缓冲区。在缓冲区为空时,消费者应该等待生产者放入数据;在缓冲区满时,生产者应该等待消费者取走数据。这时就可以使用信号量来协调它们的操作。

# Python 代码示例

from threading import Semaphore, Thread
import time

buffer = []
mutex = Semaphore(1)
items = Semaphore(0)
spaces = Semaphore(10)

def producer():
    for i in range(20):
        spaces.acquire()
        mutex.acquire()
        buffer.append(i)
        print(f"Produced: {i}")
        mutex.release()
        items.release()
        time.sleep(0.5)

def consumer():
    for i in range(20):
        items.acquire()
        mutex.acquire()
        item = buffer.pop(0)
        print(f"Consumed: {item}")
        mutex.release()
        spaces.release()
        time.sleep(1)

Thread(target=producer).start()
Thread(target=consumer).start()


在这个例子中,spaces 表示缓冲区中的可用空间数,items 表示缓冲区中的物品数量,mutex 是用于保护对缓冲区的访问。producer 往缓冲区中放入数据,consumer 从缓冲区中取出数据,通过信号量 spaces 和 items 来确保生产者和消费者的同步操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值