北京郵電大學 張彥博
針對理發師問題進行了拓展,考慮多種需求的顧客,多種功能的理發師,在Linux下利用pthread給出多線程解決方案。
傳統理發師問題針對一位單一功能的理發師和多位單一需求的顧客,但是在實際應用中,問題往往更加復雜,理發師將會有多種功能,顧客也會有多種需求,比如理發和燙發。拓展過后的理發師問題可以較為方便的拓展到其他領域,因此,需要對傳統的理發師問題解法進行改良。本文給出對傳統理發師問題更貼近實際的一種拓展,并針對拓展問題給出了解決方案,以供解決同類問題借鑒。
為了符合實際情況,以利于拓展,添加如下假設:
(1)理發師可以由一種或多種功能(如理發或燙發);
(2)顧客可以有選擇多種需求,但一個顧客只能選擇一種;
(3)一定條件下顧客可以等待。
一家理發店里有X位理發師,其中N個理發師只會理發,M個理發師可以燙發或理發(燙發優先,沒有顧客燙發時,才會理發)。店內有Y把供等候理發顧客坐的椅子。如果沒有顧客,則理發師在理發椅上睡覺。當一個需要理發的顧客到來時,他會優先叫醒只會理發的理發師,除非只會理發的理發師已經為他人服務;需要燙發顧客來時,只會找燙發的理發師(如果當前燙發的理發師空閑,則直接為其進行燙發服務;如果當前有理發的顧客,則為該顧客理發完后才為下一位顧客進行燙發服務,當前需要燙發的顧客需等待)。如果X個理發師正在為X個顧客服務時,又有顧客來到,并且如果有空椅子可坐,他們就坐下來等待。如果沒有空椅子,他會按一定條件選擇等待或離開。假定燙發時間長于理發時間,燙發理發時間固定。
首先將問題簡化,假設理發師一共有三個,兩個只能理發的理發師和一個可以理發也可以燙發的理發師。首先對理發師進行分析,對于單一功能理發師(只能理發的理發師),其只能理發,則和傳統理發師問題一樣處理即可。核心代碼如下:
void* C_barber(){//普通理發師,只會理發
while(1) {
if(waiting == 0)
對于由多功能理發師和多需求顧客的理發師問題,本文給出一種可行解。同時,可以發現,本文給出的方法比較容易拓展,能比較輕松地應用到理發師問題的其他變種里面去。