问题描述
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费.为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。
问题的解?
代码
用一个指针in来指示下一个可利用的空缓冲区,用一个指针out来表示下一个可利用的满缓冲区。代码如下:
int in=0,out=0;
void producer() //生产者程序
{
while(true)
{
item=produceItem(); //生产一个产品
putItemIntoBuffer(item); //将产品放入缓冲区
in=(in+1)mod n; //修改指针位置
}
}
void consumer() //消费者程序
{
while(true)
{
item=removeItemFromBuffer(); //从缓冲区取走一个产品
out=(out+1)mod n; //修改指针位置
consumeItem(item); //消费该产品
}
}
分析
虽然上述的生产者和消费者程序在分别看时都是正确的,即使是顺序执行时结果也是对的,但是,当存在多个生产者,消费者时,就会出现错误,主要体现在以下方面:
1. 同步问题
即:不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个满缓冲区投放产品。在上述程序中,这些情况均未加以控制。因此,可利用信号量empty和full分别表示缓冲区中空缓冲区和满缓冲区的资源数量。