問題描述:
理發店理有一位理發師、一把理發椅和n把供等候理發的顧客坐的椅子 如果沒有顧客,理發師便在理發椅上睡覺 一個顧客到來時,它必須叫醒理發師 如果理發師正在理發時又有顧客來到,則如果有空椅子可坐,就坐下來等待,否則就離開
程序模型:
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); //人滿了,走吧! }