empty = Semaphore(n)
full = Semaphore(0)
mutex = Semaphore(1)
buffer = [None] * n
in_idx = 0
out_idx = 0
# 生产者进程
def producer():
while True:
nextp = produce()
empty.acquire()
mutex.acquire()
buffer[in_idx] = nextp
in_idx = (in_idx + 1) % n
mutex.release()
full.release()
# 消费者进程
def consumer():
while True:
full.acquire()
mutex.acquire()
nextc = buffer[out_idx]
out_idx = (out_idx + 1) % n
mutex.release()
empty.release()
consume(nextc)
生产者进程和消费者进程都使用同一个缓冲区,以及同一个empty信号量和full信号量来同步和互斥访问缓冲区。具体来说,empty信号量表示缓冲区中空闲的槽位数量,full信号量表示缓冲区中已经被占用的槽位数量。mutex信号量用于互斥访问缓冲区。