生产者消费者问题
问题描述是:有一群生产者进程在生产产品,此产品提供给消费者去消费。为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。
semaphore mutex=1,empty=n,full=0;
item buffer[n]; //缓冲区
int in=out=0; //输入、输出指针
void producer()
{
do{
…
生产一个产品nextp;
…
wait(empty); //首先对empty--判断他是否小于0,小于0就自我阻塞(相当于看是否有空位子)
wait(mutex); //拿到锁,否则就自我阻塞
buffer[in]= nextp; //往Buffer [in]放产品
in = (in+1) % n;
signal(mutex); //释放锁
signal(full); //对full++判断是否<=0,如果是就唤醒进程
}while(true)
}
void consumer()
{
do{ ……
wait(full); //首先对full--判断他是否小于0,小于0就自我阻塞(相当于看是否有产品可以消费)
wait(mutex); //拿到锁,否则就自我阻塞
nextc = buffer[out]; //从Buffer [out]取产品
out = (out +1) mod n;
signal(mutex); //释放锁
signal(empty); //对empty++判断是否<=0,如果是就唤醒进程
消费nextc产品;
}while(true)
}
main()
{
cobegin{
producer();
consumer();
}
//wait(x)是把x这个信号量进入临界区,
signal(y)是把y这个信号量离开临界区。
注意:如果wait(full),wait(mutex)互换位置就会发生死锁