经典进程同步问题之生产者消费者问题
经典进程同步问题之生产者消费者问题
什么是生产者消费者问题
学术性描述:生产者-消费者(producer-consumer)问题是一个著名的进程同步问题。它描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n 个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。其大概结构图如下:
通俗描述:生产者-消费者问题在生活中实际上有许多例子,比如吃自助餐的过程,由于由于桌子上摆放食物的空间是有限的,因此当厨师用食物将桌子摆满之后就不能再放了,要等到有顾客来取走食物余出空间之后才能够继续摆放食物。而顾客在取食物的过程中也不是说可以无限去取的,当桌子上没有食物的时候,顾客显然是无法获得食物,此时他需要等待,等着厨师把食物放到桌子上之后,才能继续取。这整个过程其实就是一个生产者-消费者问题。
代码实现
semaphore mutex=1; //临界区互斥信号量
semaphore empty=n; //空闲缓冲区
semaphore full=0; //缓冲区初始化为空
producer() { //生产者进程
while (1) {
produce an item in nextp; //生产数据
P (empty); (要用什么, p 一下) //进入临界区
P (mutex); (互斥夹紧) //将数据放入缓冲区
add nextp to buffer; (行为) V (mutex); (互斥夹紧) //离开临界区,释放互斥信号量
V (full); (提供什么,v 一下) //满缓冲区数加1
}
}
consumer(){ //消费者进程
while(1){
P(full); //获取满缓冲区单元
P(mutex); //进入临界区
remove an item from buffer; //从缓冲区中取出数据
V(mutex); //离开临界区,释放互斥信号量
V(empty); //空缓冲区数加1
consume the item; //消费数据
}
}