多生产者-多消费者问题

问题描述

桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自已需要的水果时,儿子或女儿可以从盘子中取出水果。

用PV操作实现上述过程。

问题分析

互斥关系(mutex=1):对缓冲区(盘子)的访问要互斥地进行

同步关系(一前一后):

  1. 父亲将苹果放入盘子后,女儿才能取苹果

  2. 母亲将橘子放入盘子后,儿子才能取橘子

  3. 只有盘子为空时,父亲或母亲才能放入水果

如何实现

即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象

原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区

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

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

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

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

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

最后更新于