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

      

  • 相关阅读:
    linq教程
    linq 多表分组查询统计
    System.Diagnostics.Trace.Listeners
    linq多表join与group
    LINQ的左连接、右连接、内连接
    linq pad
    开源项目
    linq group join
    OWIN OAuth 2.0 Authorization Server
    autofac + owin + webform + mvc + webapi集成demo
  • 原文地址:https://www.cnblogs.com/mjn1/p/10632104.html
Copyright © 2020-2023  润新知