2.3.6 生产者消费者问题
知识来源: B站王道考研 问题描述系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能吧产品放入缓冲区,否则必须等待。
只有缓冲区不为空时,消费者才能从中取出产品,否则必须等待。
缓冲区是临界资源,各进程必须互斥地访问。
semaphore mutex = 1; // 互斥信号量,实现对缓冲区的互斥访问 semaphore empty = n; // 同步信号量,表示空闲缓冲区的数量 semaphore full = 0; // 同步信号量,表示产品的数量,即非空缓冲区的数量 123
producer(){while(1){生产一个产品;P(empty); // 消耗一个空闲缓冲区,保证没有在同一个放入产品P(mutex); // 实现互斥访问把产品放入缓冲区;V(mutex); // 实现互斥访问V(full); // 增加一个产品} } 12345678910
consumer(){while(1){P(full); // 消耗一个非空缓冲区(产品)P(mutex);从缓冲区取出一个产品;V(mutex);V(empty); // 空出一个缓冲区使用产品} } 12345678910
实现互斥的P操作一定要在实现同步的P操作之后。
V操作不会导致进程阻塞,因此两个V操作顺序可以交换。