使用執行緒模擬解決銀行排隊叫號問題

2021-10-11 16:13:42 字數 1292 閱讀 6367

在銀行中有乙個叫號機,有乙個10個座位的長椅,客戶在叫號後如果無人在櫃檯前服務,就會去要求服務;如果櫃檯忙,則會找長椅入座;如果長椅滿則會離開。

要求顯示輸出叫號過程,分析程式執行狀況,並對程式作出評估。

定義兩個訊號量chair,call。使用sem_init()初始化訊號量,分別賦值為11和2,因為使用sem_wait()時,值為-1就開始阻塞不能訪問共享資源叫號服務和座位,call賦初值為2,可以實現乙個執行緒訪問另乙個執行緒執行sem_wait()函式時,可以訪問共享資源不會阻塞,這樣就可以實現乙個執行緒被服務,其餘執行緒也可以接受臨界區資源的服務而不被阻塞。同樣chair訊號量也是這個原理。因為執行緒的建立和訪問時隨機的,訊號量的等待和釋放也是在短時間內完成的,所以使用sleep函式來實現,**被服務的時間和在座位上等待的時間。同時在櫃檯空閒時,座位上的客戶可以到櫃檯上接受服務。本實驗**提前設定了15個客戶,在體驗方面與真實的的銀行服務有差別,因為執行緒的建立和登出都是瞬時的,只要執行緒數量足夠多,實現結果越接近真實的銀行服務。

#include

#include

#include

#include

#include

void

*consumer

(void*)

;sem_t chair, call;

intmain()

int consumernum[15]

; pthread_t consumerpthread[10]

;int i;

for(i =

0; i <

15; i++)}

for(i =

0; i <

15; i++

)pthread_join

(consumerpthread[i]

,null);

sem_destroy

(&chair)

;sem_destroy

(&call)

;printf

("程式結束\n");

離散事件模擬 銀行排隊

某銀行有四個視窗接待客戶,每個視窗在某個時刻只能接待乙個客戶,人數多時則需要進行排隊,剛進來的客戶,視窗無人則進行業務辦理,有人則排隊,排在人數最少的隊伍後面。問題 計算在銀行關閉之前,計算客戶在銀行逗留的平均時間 用c寫的,給書上 的實現了下,如下 include include include ...

離散事件模擬 銀行排隊

假設不存在插隊的情況,並且人人都會選擇排到人數最少的那乙個視窗排隊。假設人們陸續到達銀行,不會同時到達銀行。如下 include include include define max size 10000 佇列的初始化長度 define end time 10000 銀行關門時間 using nam...

離散事件模擬 銀行排隊時間模擬

在資料結構中有個講述如何模擬銀行排隊,最終算出每個人平均的逗留時間。這是需要資料結構的知識。將銀行的每個視窗看成是乙個佇列,那麼對於每次來乙個人,都需要從最短的佇列進行排隊。其實更優秀的做法是從最短的等待時間佇列來排隊 這裡的做法是這樣的,首選在乙個佇列中插入乙個人,整個事件是事件驅動的,每次去檢查...