桌上有一空盤,最多允許存放一隻水果。爸爸只向盤中放一個蘋果,媽媽只向盤中放一個桔子,兒子專等喫盤中的桔子,女兒專等喫蘋果。用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
}

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