多執行緒程式設計入門之售票員問題

2021-09-16 14:18:54 字數 1510 閱讀 8855

我所用的實驗環境是vs2017,首先需要配置一下多執行緒程式設計的環境,具體配置方法請參見可以完美配置。

售票員問題需要用到的函式有

int pthread_create(pthread_t *tidp,const pthread_attr_t attr,

(void)(start_rtn)(void),void *arg);

簡單的說,這是乙個建立多執行緒的函式,它總共有四個引數。

第乙個引數為指向執行緒識別符號的指標。

第二個引數用來設定執行緒屬性。

第三個引數是執行緒執行函式的起始位址。

最後乙個引數是執行函式的引數。

如果不需要設定執行緒的屬性和函式的引數,也就是說不需要第二個和第四個引數,則直接用null代替就好了。

int pthread_join(pthread_t thread, void **retval);

這個函式的功能簡單來說就是等待乙個執行緒的結束,如果不加這個函式,很有可能主調函式(比如說main函式)都執行完了,而被呼叫的執行緒還沒有執行結束,這顯然不是我們期望的結果。

引數 :thread: 執行緒識別符號,即執行緒id,標識唯一執行緒。retval: 使用者定義的指標,用來儲存被等待執行緒的返回值。如果沒有返回值,直接把第二個引數寫成null就可以了。

上面兩個函式是多執行緒程式設計問題的基本函式,售票員問題中,還會用到兩個函式,pthread_mutex_lock和pthread_mutex_unlock,簡單說就是對執行緒進行加鎖和解鎖,具體用法可以參考**。這個問題中為什麼需要用到這兩個函式呢?我們這樣想,如果售票員a正在**一張票,我們給這張票乙個編號,就讓它編號為100吧,這時售票員b就不能再**這張編號為100的票,因此我們在售票員a賣票時,就不應該讓其他售票員同時賣票。

下面放源**,這裡有乙個奇怪的問題,如果我把這四個售票函式中的for迴圈執行條件由tickets > 0改為tickets != 0,程式就會變成乙個死迴圈,大家可以嘗試一下。

#include "pch.h"	//vs中要包含這個標頭檔案

#include #include//多執行緒標頭檔案

#include//sleep函式要用到這個標頭檔案

#pragma comment(lib,"pthreadvc2.lib")

int tickets = 100; //假定總共**一百張票

pthread_mutex_t mutex;

void *seller1(void * x)

//tickets--;

return (null);

}void *seller2(void *x)

//tickets--;

return (null);

}void *seller3(void *x)

//tickets--;

return (null);

}void *seller4(void *x)

//tickets--;

return (null);

}int main()

Go併發程式設計 模擬併發模型 司機與售票員

上題 實現 package ossync import fmt while true while true 關門才可以啟動車輛 停車之後才能開門 var canstart make chan bool 表示司機程序p1能否啟動汽車 var canopendoor make chan bool 表示售...

作業系統P V操作,司機 售票員問題 c語言實現

設公共汽車上,司機和售票員的活動分別是 司機 啟動車輛 正常行駛 到站停車 售票員 關車門 售票 開車門 訊號量 semaphore 的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對...

Linux 多執行緒程式設計入門

建立執行緒 intpthread create pthread t restrict thread,const pthread attr t restrict attr,void start routine void void restrict arg 引數 thread 輸出執行緒id attr ...