理髮師多執行緒實現 麵包師多程序實現

2021-08-13 23:06:55 字數 3302 閱讀 4622

理髮師問題的實現,多執行緒。

有乙個理髮師,一把理髮椅和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...