生产者消费者问题
问题描述
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者
进程每次从缓冲区中取出一个产品并使用。(注: 这里的“产品”理解为某种数据)
生产者、消费者共享一个初始为空、大小为n的缓冲区
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待
缓冲区是临界资源,各进程必须互斥地访问
如何用信号量机制(P、V操作)实现生产者、消费者进程的这些功能呢?
-
信号量机制可实现互斥、同步、对一类系统资源的申请和释放。
-
关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
-
整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品;消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。往缓冲区放入/取走产品需要互斥。
-
设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。
互斥信号量一般为1,同步信号量则要看对应的初始值为多少
semaphore mutex = 1;//互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n;//同步信号量,表示空闲缓冲区的数量
semaphore full = 0;//同步信号量,表示产品的数量,也即非空缓冲区的数量
produce()
{
while(1){
P(empty);
生产产品;
P(mutex);
V(full);
将产品放入缓冲区
V(mutex);
}
}
consumer()
{
while(1)
{
P(full);
P(mutex);
从缓冲区中取出产品;
V(mutex);
V(empty);
消耗产品;
}
}
实现互斥的P操作一定要在实现同步的P操作之后,否则会导致死锁现象的产生