设有三个进程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三个进程并发执行 }