一 問題描述
(經典理髮師問題)
假設後街有家理髮店,店裡有乙個理髮師、一把理髮椅和n把等候理髮的顧客椅子。
(1).如果沒有顧客則理髮師便在理髮椅上看報紙;
(2).當有乙個顧客到達時,首先檢視理髮師在幹什麼,如果在看報紙則告訴理髮師理髮,然後坐到理髮椅上開始理髮;如果理髮師正在理髮,則檢視是否有空的椅子可坐,如果有,他就坐下等待,如果沒有,則離開;
(3).理髮師為一位顧客理完發後,檢視是否有人等待,如有則喚醒一位為其理髮,如沒有則在理髮椅上看報紙;
(4).顧客不分優先順序
二 問題分析
題目中要求描述理髮師和顧客的行為,因此需要兩類程序barber ()和customer()分別描述理髮師和顧客的行為。當理髮師看報時顧客近來需要喚醒理髮師為其理髮,當有顧客時理髮師為其理髮,沒有的時候理髮師看報,因此理髮師和顧客之間是同步的關係,由於每次理髮師只能為乙個人理髮,且可供等侯的椅子有限只有n個,即理髮師和椅子是臨界資源,所以顧客之間是互斥的關係。故引入3個訊號量和乙個控制變數:1)控制變數waiting用來記錄等候理髮的顧客數,初值均為0;2)訊號量customers用來記錄等候理髮的顧客數,並用作阻塞理髮師程序,初值為0;3)訊號量barbers用來記錄正在等候顧客的理髮師數,並用作阻塞顧客程序,初值為0;4)訊號量mutex用於互斥,初值為1
三 問題實現
1.pv操作**如下:
int waiting=0 ; //等候理髮的顧客數
int chairs=n; //為顧客準備的椅子數
semaphore customers=0, barbers=0,mutex=1;
barber()
customer()
else
v(mutex); //人滿了,走吧!}
2.詳細實現:
椅子數目可以設定;程式採用用隨機數產生顧客程序,也就是顧客按照隨機數自動到來,這樣更加接近現實生活;對於理髮師,當顧客到來後去理髮,如果沒有顧客繼續看報紙,當理完乙個後,判斷是否有等待,有則叫下乙個來理髮,沒有的話去看報紙。對於客人,先看理髮師是空閒還是忙,空閒則去理髮,忙著的話則看是否有位置等待,有則坐下等,沒有的話則離開。對於理髮時間,是取系統時間來控制,設理髮時間為10秒,當兩次時間差大於等於10時表示理完叫下一位,小於則繼續理髮。並且還能控制是否開門營業,當理髮師為10個以上顧客理髮完成並且沒有人在等待時,可以決定是否關門休息.
**如下:
#include "windows.h"
#include "iostream.h"
#include "math.h"
#define random (rand()*10000)/rand_max //定義乙個隨機函式來產生顧客,並且使兩個顧客間的時間少於10秒
int long waiting(0); //正在等待的顧客的數目
int chairs; //椅子的總數目
char open_door; //開門
char close_door; //關門
int count(0); //顧客的號碼數
int finish(0); //理髮完畢的顧客數目
dword a;
void cuthair()
void gethaircut()
else
handle hthread1;
handle hthread2;
hthread2=::createthread (null,0,barber,null,0,null); //產生乙個理髮師程序
while(close_door!='y')
else ;
}if (close_door=='y')
}
理髮師悖論
由著名數學家 伯特蘭 羅素 bertrand a.w.russell,1872 1970 提出的悖論與之相似 在某個城市中有一位理髮師,他的廣告詞是這樣寫的 本人的理髮技藝十分高超,譽滿全城。我將為本城所有不給自己刮臉的人刮臉,我也只給這些人刮臉。我對各位表示熱誠歡迎!來找他刮臉的人絡繹不絕,自然都...
c 實現理髮師問題。。
include include include include include define max count 10 最多理髮人數 define chairs 4 店中椅子的總數目 using namespace std intwaiting 0 等待理髮的顧客人數 char close door...
理髮師問題c 作業系統
這是關於理髮師問題的c 程式,如果對其中函式有不理解的可以看我另一篇部落格程序相關函式彙總解釋,對照著看,可能方便你理解 include include include using namespace std define chairs 5 椅子數目 define max count 10 顧客最多...