生产者-消费者问题
生产者-消费者问题
系统中有一组生产者进程和一组消费者进程,生产者进程每次生一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用
生产者和消费者共享一个初始为空,大小为n的缓冲区
缓冲区没有满的时候,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区没空的时候,消费者才能从中取出产品,否则必须等待。
缓冲区是一种临界资源,各进程必须互斥访问
semaphore mutex=1;//互斥信号量,实现对缓冲区的互斥访问
semaphore empty=n;//同步信号量,代表空闲缓冲区的数量
semaphore full=0;//同步信号量,代表产品的数量
producer(){
while(1){
生产一个产品;
P(empty);//消耗一个空闲缓冲区
P(mutex);
放入;
V(mutex);
V(full);//消耗一个非空缓冲区,代表增加了一个产品
}
}
consumer(){
while(1){
P(full);//消耗一个产品
P(mutex);
取出;
V(mutex);
V(empty);//增加一个空闲缓冲区
使用产品;
}
}
互斥的P操作,一定要在实现同步的P操作之后,顺序不能颠倒
但是V操作可以随意交换顺序,不会导致进程阻塞