生产者-消费者问题(三个进程P1、P2、P3互斥使用一个包含N个单元的缓冲区)

1.问题描述

在这里插入图片描述

2.问题分析

同步问题:
(1)包含N个缓冲区单元,有空位置时才能写,即P1、P2、P3共享缓冲区空位,设置同步信号量empty;
(2)存在奇数时才能读出奇数,P1、P2共享奇数缓冲区,设置同步信号量odd;
(3)存在偶数时才能读出偶数,P1、P3共享偶数缓冲区,设置同步信号量even。
互斥问题:
三个进程彼此之间互斥的访问缓冲区,设置互斥信号量mutex。

3.注意事项

1.不要误认为是读者-写者问题,注意这里P2、P3之间也是互斥的,而读者之间的访问可以同时,这里只是单生产者多消费者问题;
2.对缓冲区的互斥访问使用mutex变量对三个进程进行约束即可,不需要在P2、P3之间单独添加约束变量。

4.伪代码实现

Shared Data:

semaphore mutex=1;//互斥访问共享缓冲区;
semaphore empty=N;//共享缓冲区同步信号量
semaphore odd=0;//奇数缓冲区同步信号量
semaphore even=0;//偶数缓冲区同步信号量

The P1 Process

 	do{
        int num=produce();//生产一个数据num
 
        wait(empty);//消耗掉一个空单元
        wait(mutex);//互斥访问缓冲区;
        
        put(num);//将数据num放入缓冲区
        
        signal(mutex);
        if(num%2!=0)//奇数
            signal(odd);
        else//偶数
            signal(even);
    }while(true);

The P2 Process

  do{
        wait(odd);//有奇数时才能取出奇数
  		wait(mutex);//互斥访问缓冲区
       
        getodd();//取出奇数
        
        signal(mutex);
        signal(empty);//产生一个空单元
      
        countodd();//奇数个数加一
    }while(true);

The P3 Process

  do{
        wait(even);//有偶数时才能取出偶数
        wait(mutex);
        
        geteven();
        
        signal(mutex);
        signal(empty);
      
        counteven();
    }while(true);

5.问题参考

https://blog.csdn.net/weixin_45385429/article/details/115255883
https://blog.csdn.net/qq_39328436/article/details/109956241
https://blog.csdn.net/qq_38900441/article/details/83350728

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值