桌上有一空盘,最多允许存放一只水果。爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。用wait、signal操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步。

分析设计四个信号量metux,empty、apple、orange;

metux表示:爸爸、妈妈、儿子和女儿进程对盘子的互斥使用;

empty表示:盘子是否为空;

apple表示:是否可以取苹果;

orange表示:是否可以取桔子。

算法描述如下:

semaphore empty=1,nutex=1,apple=0,orange=0;  //为四个信号量赋初值
void father(){
     do{
           wait(empty);    //等待盘子为空
           wait(metux);    //等待获取对盘子的操作
            爸爸向盘中放一个苹果;
           signal(mutex);   //释放对盘子的操作
           signal(apple);   //通知女儿可以来盘子中取苹果
    }while(TRUE);
}
void mather(){               //与父亲进程雷同
     do{
           wait(empty);
           wait(metux);
            妈妈向盘中放一个桔子;
           signal(mutex);
           signal(orange);
    }while(TRUE);
}
void son(){                        
     do{
           wait(orange);       //判断盘子中是否有桔子
           wait(metux);        //等待获取对盘子的操作
            儿子取出盘中的桔子;
           signal(mutex);      //释放对盘子的操作
           signal(empty);      //盘子空了,可以继续放水果了
    }while(TRUE);
}
void daugther(){               //与儿子进程雷同
     do{
           wait(apple);
           wait(metux);
            女儿取出盘中的苹果;
           signal(mutex);
           signal(empty);
    }while(TRUE);
}
void main() {               //四个并发进程的同步执行
	cobegin
	   father();mather();son();daugther();
	coend
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章