經典PV操作問題 [轉]


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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM