8.4 经典进程同步问题-吃水果问题

问题描述

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

问题分析

  1. 关系分析。由每次只能向其中放入一只水果可知爸爸和妈妈是互斥关系。爸爸和女儿、妈妈和儿子是同步关系,而且这两对进程必须连起来。儿子和女儿之间没有互斥和同步关系,因为他们是选择条件执行,不可能并发。

  2. 整理思路。这里有4个进程,实际上可以抽象为两个生产者和两个消费者被连接到大小为1的缓冲区上。


  3. 信号量设置。首先设置信号量plate为互斥信号量,表示是否允许向盘子放入水果,初值为1,表示最多只允许放入一个。信号量 apple表示盘子中是否有苹果,初值为0,表示盘子为空,若apple=1,则表示可取。信号量orange表示盘子中是否有橘子,初值为0,表示盘子为空,若orange=1,则可取。

解决方案

代码描述如下:

semaphore plate=l, apple=0, orange=0;
dad() {  //父亲进程
    while (1) {
        prepare an apple;
        P(plate) ;  //互斥向盘中取、放水果
        put the apple on the plate;  //向盘中放苹果
        V(apple);  //允许取苹果
    }
}

mom() {  // 母亲进程
    while(1) {
        prepare an orange;
        P(plate);  //互斥向盘中取、放水果
        put the orange on the plate;  //向盘中放橘子
        V(orange); //允许取橘子
    }
}

son(){  //儿子进程
    while(1){
        P(orange) ;  //互斥向盘中取橘子
        take an orange from the plate;
        V(plate);  //允许向盘中取、放水果
        eat the orange;
    }
}

daughter () {  //女儿进程
    while(1) {
        P(apple);  // 互斥向盘中取苹果
        take an apple from the plate;
        V(plate);  //运行向盘中取、放水果
        eat the apple;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ** 本文摘自汤小丹主编《计算机操作系统》(第三版)2.3 进程同步 ** 在 OS 中引入进程后,虽然提高了资源...
    刘帅_阅读 8,283评论 0 0
  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 6,067评论 1 7
  • 今日推荐《鲫鱼豆腐汤》——食材清单:鲫鱼、嫩豆腐、老姜、小葱 注:鲫鱼打理好煎至两面黄(此时可加少量料酒),放入老...
    川郎阅读 1,248评论 0 0
  • 文/孤鸟差鱼 某一次失眠,和人聊天。 他向我说起“当夜里我总是想着她,她也用着干涩的眼睛盯着惨白的屏幕………” 我...
    孤鸟差鱼阅读 1,378评论 1 3
  • 窗外风雨交加, 屋内温暖美食佳肴, 暴风雨、美食, 因为一个你, 所有的幸福, 全是这样得来的.
    与自己赛跑的人阅读 1,235评论 0 1