2.3.7 多生产者多消费者问题

  桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。
  不同于一个(类)生产者一个(类)消费者问题,本题目中含有多个生产者多个消费者,但是临界资源还是1且为互斥共享。很明显这个题目的互斥关系为对盘子的访问要互斥进行;这个题目的同步关系有三个,1. 父
亲将苹果放入盘子后,女儿才能取苹果 2. 母亲将橘子放入盘子后,儿子才能取橘子 3. 只有在儿子或者女儿取出了水果之后父母才能放水果。用前驱图表示同步关系如下:

 
semaphore mutex = 1; //实现互斥访问盘子(缓冲区)
semaphore apple = 0; //盘子中有几个苹果
semaphore orange = 0; //盘子中有几个橘子
semaphore plate = 1; //盘子中还可以放多少个水果

dad (){
    while(1){
        准备一个苹果;
        P(plate);
        P(mutex);
        把苹果放入盘子;
        V(mutex);
        V(apple);
    }
}

mom (){
    while(1){
        准备一个橘子;
        P(plate);
        P(mutex);
        把橘子放入盘子;
        V(mutex);
        V(orange);
    }
}

daughter (){
        while(1){
        P(apple);
        P(mutex);
        从盘中取出苹果;
        V(mutex);
        V(plate);
        吃掉苹果;
    }
}

son (){
    while(1){
        P(orange);
        P(mutex);
        从盘中取出橘子;
        V(mutex);
        V(plate);
        吃掉橘子;
    }
}

  可能有的同学会问为什么设置了一个mutex=1还要再有一个plate=1呢?mutex完成的任务是保证互斥,其值并无实际意义;plate代表的是缓冲区的大小,可以随着题目条件而改变。顺便一提,其实在本题中mutex可以不要,因为在任何时候apple、orange、plate 三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。但是再平常的时候我们还是写上互斥信号量比较好。


版权声明:本文为qq_40608137原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40608137/article/details/104719604