問題描述: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); //人滿了,走吧! }