理髮師問題的實現,多執行緒。
有乙個理髮師,一把理髮椅和4把供等候理髮的顧客坐的椅子。如果沒有顧客,則理髮師便在理髮師椅子上睡覺;當乙個顧客到來時,必須喚醒理髮師進行理髮;如果理髮師正在理髮時又有顧客來到,則如果有空椅子可坐,他就坐下來等,如果沒有空椅子,他就離開。為理髮師和顧客各編一段程式實現他們的行為。使用執行緒實現
初始化:顧客數為0,表示還沒有顧客過來;理髮師為0,表示理髮師在睡覺;互斥訊號量,用於控制臨界區,防止同時修改waiting 值;椅子數為4,表示最多有4個顧客等待。
建立乙個理髮師執行緒,建立10個顧客程序,每次經過隨機事件建立乙個
程式流程圖
sem_t customers;//等待服務的顧客數
sem_t barbers;//等待顧客的理髮師數
pthread_mutex_t mutex;//用於互斥
int waiting = 0;//等待的顧客
int if_no_more = 0;
void cut_hair()
void* barber()
sleep(3);
printf("下班\n");
return;
}void* customer()
執行顯示介紹
gcc ***.c -oxx -lpthread 編譯
理髮師:當沒有顧客時,理髮師睡覺
當有顧客時,理髮師為一位顧客理髮,等待理髮的人數減1。
當不在有顧客來時,並且沒有顧客在等待,理髮師下班
顧客: 當有空椅子時:新加了一位顧客,等待理髮的人數加1.
當沒有空椅子時:沒有空椅子了,我換一家。
執行結果
麵包師有很多麵包和蛋糕,由 3 個銷售人員銷售。每個顧客進店後先取乙個號,並且等著叫號。當乙個銷售人員空閒下來,就叫下乙個號。請分別編寫銷售人員和顧客程序的程式。
使用多程序實現:
建立2個共用的訊號量,waiting和free,waiting 初始值為3表示有3個售貨員,free初始值為0表示初始沒有顧客在等待。
:建立了三個銷售人員程序來為顧客服務。
銷售人員程序減少waiting的人數,在程序執行過程中,free人數會先減一,在為顧客服務完之後,free人數加一。
:乙個顧客程序。
顧客程序增加waiting的人數
程式流程圖:
**:
#include
#include
#include
#include
#include
#include
#include
#include
#define start "\033[1;%dm"
#define end "\033[0m"
#define mykey 2//制定訊號燈集的標誌
union semun
sem1,sem2;
int semaphore_create();
int output_semaphore(int sid);
int up_num_of_waiting(int sid);
int down_num_of_waiting(int sid);
int up_num_of_free(int sid);
int down_num_of_free(int sid);
//建立訊號集,並返回訊號燈集描述字
int semaphore_create()
//輸出對應訊號集中訊號的數量
int output_semaphore(int sid)
int up_num_of_waiting(int sid);*/
struct sembuf operation = ;//等待人數加1
return semop(sid, &operation, 1);}
int down_num_of_waiting(int sid)
;//等待人數減一
return semop(sid, &operation, 1);}
int up_num_of_free(int sid)
;//空閒服務員人數加1
return semop(sid, &operation, 1);}
int down_num_of_free(int sid)
;//空閒服務員人數減1
return semop(sid, &operation, 1);}
void customer()
} void salesman() }
//將所有訊號量置初始值
void init()
int main()
sale2 = fork();
if(sale2 == 0 )
sale3 = fork();
if(sale3 == 0 )
else
return 0;}
執行顯示介紹:
顧客程序輸出:
########顧客區########
一位顧客到了
num of waiting: x
num of free: x
######################
售貨員程序輸出:
********銷售區********
銷售員xx:為顧客提供服務,空閒人數減一,等待人數減一
**********************
因為程序可以同時輸出,所以會交叉輸出,因此設定了界限,這樣在看程式輸出時,通過界限及不同程序的輸出語句,可以較清晰地看到結果
執行結果:
麵包師問題
2020 10 8 16 02 麵包師問題。麵包師有很多麵包和蛋糕,由n個銷售人員銷售。每個顧客進店後先取乙個號,並且等著叫號。當乙個銷售人員空閒下來,就叫下乙個號。試用訊號量的p v操作設計該問題的同步演算法,給出所用共享變數 如果需要 和訊號量及其初始值,並說明各自的含義。偽 semaphore...
理髮師悖論
由著名數學家 伯特蘭 羅素 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...