操做系統——理髮師問題

問題描述:spa

理髮店理有一位理髮師、一把理髮椅和n把供等候理髮的顧客坐的椅子 若是沒有顧客,理髮師便在理髮椅上睡覺 一個顧客到來時,它必須叫醒理髮師 若是理髮師正在理髮時又有顧客來到,則若是有空椅子可坐,就坐下來等待,不然就離開code

程序模型:blog

int waiting=0;//等候理髮顧客數
int CHAIRS=N; //爲顧客準備的椅子數
semaphore customers,barbers,mutex;//信號量 
customers=0;// 顧客 
barbers=0;//理髮椅上人數 
mutex=1;//互斥信號量 

//理髮師 
process barber( ) {
 while(true) {
 P(customers); //有顧客嗎?若無顧客,理髮師睡眠
 
 P(mutex);          //如有顧客時,進入臨界區
    waiting--;      //等候顧客數少一個
    V(barbers);        //理髮師準備爲顧客理髮
 V(mutex);          //退出臨界區
   
    cut_hair();     //理髮師正在理髮(非臨界區)
    }
}

//顧客 
process customer_i( ) {
  P(mutex);             //進入臨界區
 
  if(waiting<CHAIRS) {  //有空椅子嗎
        waiting++;       //等候顧客數加1
        V(customers);      //喚醒理髮師
  V(mutex);          //退出臨界區
    
    P(barbers);     //理髮師忙,顧客坐下等待
    get_haircut();   //不然顧客坐下理髮
      }
  else
  
   V(mutex);          //人滿了,走吧!
}
相關文章
相關標籤/搜索