操作系统2022-4-11(2)
第二题:
桌子上有一个空盘子,只允许存放一只水果。爸爸可以向盘中放苹果,也可以放橘子; 女儿专门吃盘子中的苹果,儿子专门吃盘子中的橘子。
规定当盘子空的时候一次只能放一只水果,请用记录型信号量机制实现他们之间的同步与互斥。
、
semaphore empty=1,mutex=1,apple=0,orange=0; /* 为四个信号量赋初值 metux表示:父亲、儿子和女儿进程对盘子的互斥使用; empty表示:盘子是否为空; apple表示:是否可以取苹果; orange表示:是否可以取桔子 */ void father(){//父亲进程 do{ wait(empty); //等待盘子为空 wait(mutex); //等待获取对盘子的操作 爸爸向盘中放一个苹果或者桔子; signal(mutex); //释放对盘子的操作 if(apple){ signal(apple); //盘中有一个苹果 }else{ signal(orange);// 盘中有一个橘子 } }while(true); } void son(){ //儿子进程吃橘子 do{ wait(orange); //判断盘子中是否有橘子 wait(mutex); //等待获取对盘子的操作 儿子取出盘中的橘子; signal(mutex); //释放对盘子的操作 signal(empty); //释放盘子空间 }while(TRUE); } void daugther(){ //女儿进程吃苹果 do{ wait(apple); //判断盘子中是否有苹果 wait(mutex); //等待获取对盘子的操作 女儿取出盘中的苹果; signal(mutex);//释放对盘子的操作 signal(empty);//释放盘子空间 }while(TRUE); } void main() { cobegin father(); son(); daugther(); coend }