1. 程式人生 > >裝水問題(引入普通變數)

裝水問題(引入普通變數)

///****似乎解法是一個工人,而不是兩個工人,需要改進****//////

問題描述:

  兩個搬運工人向卡車中裝純淨水,每車最多20箱。卡車裝滿即開走,需裝10輛車。給出簡單的同步分析及演算法,寫明訊號量的含義和初值

  提示:訊號量和普通變數結合使用

解答 :

設定變數

/***車(互斥)***/

①semaphore m=1

/***工人裝滿20箱水->車就離開(同步)***/

②semaphore go=0

/***記錄車裝水20次,實現車需要裝水->工人裝水(同步),用for迴圈控制裝20次***/

【3】semaphore empty=0

/***設定一個整形變數count,用於判斷工人是否裝水20次用來響應車離開***/

【4】int count=0

che(){
/***車互斥***/  wait(m);
進入裝水位;

For(i=1;i<=20;i++)

//用for控制20次裝水(同步或稱為順序進行)

       signal(empty);

//釋放20次empty,即work()需要執行20次裝水才允許釋放go【work()內釋放go】

       wait(go);   //同步順序進行,當工人裝滿20次時釋放go,此時車才能離開
離開;
      signal(m);                }

void main(){

    for(i=1;i<=20;i++)

che();

work();

}

work(){
while(TRUE){
    wait(empty);

    count++;

【empty變數的設定就是為了使count變數加到20用來if語句判斷,從而釋放go變數來讓che()知道已經裝滿20次水車可以離開】

   if(count==20)

{signal(go);

【釋放go,che()可以離開了】

count=0; 

【count清零,用於下一次判斷】

}

}