linux多執行緒實驗 模擬售票系統

2022-08-22 06:09:15 字數 3042 閱讀 1613

主要用到函式:

#include pthread_create(&tid[i], nullptr, sale_ticket, static_cast(&i));//

建立執行緒

pthread_join(tid[i], nullptr);//

等待執行緒終止

pthread_mutex_t mv_num = pthread_mutex_initializer;//

初始化鎖

pthread_mutex_lock(&mv_num);//

上鎖pthread_mutex_unlock(&mv_num);//

開鎖pthread_mutex_destroy(&mv_num);//

銷毀鎖

#include time_t timep;

time (&timep); //

獲取系統時間

ctime (&timep); //

轉換成字串

#include sleep()
程式模擬了4個視窗,一起賣20張票。

1 #include 2 #include 3 #include 4 #include 5

#define window_num 4

6int total = 20

;7 pthread_mutex_t mv_num =pthread_mutex_initializer;89

void* sale_ticket(void *id)

1022 time (&timep);

23 printf("

window %d sales ticket %d at %s

", window_id, total--, ctime(&timep));

24 pthread_mutex_unlock(&mv_num);

25sleep(window_id);26}

27return

nullptr;28}

2930

intmain()

3139

for (i = 0; i < window_num; ++i)

4043 pthread_mutex_destroy(&mv_num);

44return0;

45 }

實驗結果如圖:

一些結論:

1、網上對linux下sleep()休眠的是整個程序還是某乙個執行緒的答案不統一,在我的測試環境下(ubuntu 16.04 lts),發現sleep休眠的是單獨執行緒。理由:

結果中,視窗1每1秒賣一張票,視窗2每2秒賣1張票,主線程每1秒建立乙個新視窗,相互之間時間間隔不影響。

2、printf執行緒安全,cout執行緒不安全。測試發現cout輸出時,執行緒之間相互干擾打斷。

3、ctime (&timep) 轉換過來的字串,自帶換行符。

帶補票的售票系統。

主要用到條件變數:

#include pthread_cond_t cv = pthread_cond_initializer;//

初始化條件變數

pthread_cond_wait(&cv, &mv_num);//

等待條件變數

pthread_cond_broadcast(&cv); //

**版的pthread_cond_signal(&cv);

pthread_cond_destroy(&cv);//

銷毀乙個條件變數

**:

1 #include 2 #include 3 #include 4 #include 5

#define window_num 4

6int total = 0;7

bool

flag;

8 pthread_mutex_t mv_num =pthread_mutex_initializer;

9 pthread_cond_t cv =pthread_cond_initializer;

1011

void* sale_ticket(void *id)

1223

if (total <= 0

) 27 time (&timep);

28 printf("

window %d sales ticket %d at %s

", window_id, total--, ctime(&timep));

29 pthread_mutex_unlock(&mv_num);

30sleep(window_id);31}

32return

nullptr;33}

3435

intmain()

3646

while (k--)

56 flag = false;57

for (i = 0; i < window_num; ++i)

5861 pthread_mutex_destroy(&mv_num);

62 pthread_cond_destroy(&cv);

63return0;

64 }

結果:

討論:主要是關於

while (flag && total <= 0

)

這裡用的是while而不是if。while相比if,可能在效率上不高,但是保證了穩定和安全。網上有很多解釋。

主要是兩個原因:(1)it was not interrupted; (2)due to spurious wakeup.

第一點說的是一些中斷或者非人為因素而導致的返回訊號沒被正確接受。

第二點說的就是傳說中的「驚群效應」。

java多執行緒簡單模擬售票

packagetest 模擬售票 author administrator publicclassbuyticket 多執行緒的實現方法 1 繼承 thread類 2 實現runnable介面 售票類 利用extends thread 實現多執行緒 author administrator clas...

多執行緒售票

測試 多執行緒售票 1,需求 設計4個售票視窗,總計售票100張。public class c1 方式1 extends thread class mytickets extends threadcatch interruptedexception e system.out.println supe...

多執行緒模擬火車站售票

生活中其實有很多多執行緒的例子,比如火車站售票就是乙個例子。我們先來分析一下,1 首先要有火車票的總數量,並且每賣出一張火車票,總量就減一 2 當火車票的數量小於1的時候,就停止售票 3 使用多執行緒模擬各個視窗進行售票 4 當火車票售完後,火車站也同樣歡迎我們 下來,我們 來實現火車站售票例項 p...