设有三个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲块组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者)共享另一个由m个缓冲块组成的缓冲池。用P、V操作描述它们之间的同步关系。

生产者消费者问题
设信号量mutex1, mutex2, full1, full2, empty1, empty2分别表示1和2号缓冲区的访问互斥, 是否满, 是否空
semaphore mutex1 = 1, empty1 = n, full1 = 0;
semaphore mutex2 = 1, empty2 = m, full2 = 0; 
void A()//向缓冲池1添加商品
{
	while(1)
	{
		produce next product1;
		p(empty1);//检测当前缓冲池是否为空,如果为空(说明我A需要向里面放东西了),则进行下一步,否则,阻塞本进程
		p(mutex1);//检测是否可以进入缓冲区(即检测缓冲区中是否有其他进程),若可以则自己进去并锁上门,否则,阻塞本进程
			buffer1(i) = product1;//将商品放入缓冲区1
			i = (i + 1) % n;//缓冲队列的尾指针后移
		v(mutex1);//放完商品,离开缓冲区,释放互斥访问锁,允许其他进程进入
		v(full1);//通知进程B,我已放好商品,你可以来取了
	}
}

void B()//从缓冲区1中取出商品,放到缓冲区2
{
	while(1)
	{
		p(full1);// 先检测缓冲区1内是否有货
		p(mutex1);// 有货,再检测缓冲区1是否有其他进程正在访问,没有的话,自己进去并锁上门
			goods = buffer1(j);//取货
			j = (j + 1) % n; //缓冲队列队首指针后移
		v(mutex1);// 取完货后,释放缓冲区1的互斥访问锁
		v(empty1);// 提示A我取出货了,你可以接着往里面放了
			Consume goods and Produce next product2;
		p(empty2);// 检测缓冲区2是否为空
		p(mutex2);// 检测当前缓冲区中是否有其他进程
			buffer2(a) = product2;// 向2号缓冲区放置商品
			a = (a + 1) % m;// 2号缓冲区缓冲队列队尾指针后移
		v(mutex2);// 离开缓冲区2,释放锁
		v(full2);// 通知C进程可以来取货了(我已经放进去商品了,你可以来取了)
	}
}

void C()
{
	while(1)
	{
		p(full2);// 检测2号缓冲区内是否有货
		p(mutex2);//若有货,加锁,进入
			goods = buffer2(b);//取出商品
			b = (b + 1) % m;//2号缓冲区队首指针后移
		v(mutex2);// 离开缓冲区2,释放锁
		v(empty2);// 通知B进程,我已经取出商品,你可以继续往里面放了
		Consume product;
	}
}

int main()
{
	parbegin(A(), B(), C());//A,B,C三个进程并发执行
}

  

原文地址:https://www.cnblogs.com/mjn1/p/10632104.html