1. 睡眠理發師問題
理發店里有一位理發師、一把理發椅和n把供等候理發的顧客坐的椅子。如果沒有顧客,則理發師便在理發椅上睡覺,如圖2-20所示。當一個顧客到來時,他必須先叫醒理發師,如果理發師正在理發時又有顧客來到,則如果有空椅子可坐,他們就坐下來等。如果沒有空椅子,他就離開。這里的問題是為理發師和顧客各編寫一段程序來描述他們的行為,要求不能帶有競爭條件。
我們的解法使用三個信號量:customers,用來記錄等候理發的顧客數(不包括正在理發的顧客);barbers,記錄正在等候顧客的理發師數,為0或1;mutex,用於互斥。我們還需要一個變量waiting,它也用於記錄等候的顧客數,實際上是customers的一份拷貝。之所以使用waiting是因為無法讀取信號量的當前值。在該解法中,進入理發店的顧客必須先看等候的顧客數,如果少於椅子數,他留下來等,否則他就離開。
我們的解法示於圖2-21。
1 # define CHAIRS 5 /*為等待的顧客准備的椅子數*/ 2 3 typedef int semaphone ; /*運用你的想象力*/ 4 semaphore customers=0; /*等待服務的顧客數*/ 5 semaphore barbers=0; /*等待顧客的理發師數*/ //[轉者注:初值為0] 6 semaphore mutex=1; /*用於互斥*/ 7 int waiting=0; /*等待的顧客(還沒理發的)*/ 8 9 void barber(void) 10 { 11 while(TRUE) 12 { 13 down(customers); 14 /*如果顧客數是0,則睡眠*/ 15 down(mutex); /*要求進程等待*/ 16 waiting=waiting-1; /*等待顧客數減1*/ 17 up(barbers); 18 /*一個理發師現在開始理發了*/ 19 up(mutex); /*釋放等待*/ 20 cut_hair(); /*理發(非臨界區操作)*/ 21 } 22 } 23 24 void customers(void) 25 { 26 down(mutex);/*進入臨界區*/ 27 if(waiting < CHAIRS) 28 {/*如果沒有空椅子,就離開*/ 29 waiting = waiting + 1;/*等待顧客數加1*/ 30 up(customers); /*如果必要的話,喚醒理發師*/ 31 up(mutex); /*釋放訪問等待*/ 32 down(barbers);/*如果barbers為0,就入睡*/ 33 get_haircut();/*坐下等待服務*/ 34 } 35 else 36 up(mutex);/*店里人滿了,走吧*/ 37 } 38
[轉] http://blog.csdn.net/sarah_jieyu/article/details/6510521