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 来确保生产者和消费者的同步操作。