C 多執行緒中的小白(3)執行緒傳參詳解

2021-10-10 10:43:10 字數 1484 閱讀 1106

(1)傳遞臨時物件作為執行緒引數

(2)傳遞類物件智慧型指標作為執行緒引數

(3)用成員函式指標做執行緒函式

在實際工作中我們要建立的執行緒可能不止乙個,比如說我們要建立10個,編號從0到9,這10個執行緒會根據自己的編號確定自己要幹的事情,這個執行緒如何知道自己的編號呢,這個就需要我們給執行緒傳遞引數(比如我們傳遞0123456789這10個數,那麼執行緒就通過接收的這個引數就知道自己的編號了。)。

void myprint(const int &i,char *pmybuf)

{ cout執行結果:

上述要注意的問題1是:

假如我上邊沒有使用join,使用的是detach(),主線程和子執行緒分別執行自己的。那麼有可能主線程先執行完了(主線程執行完了也無所謂,子執行緒在後台繼續執行。)

上述我們看到了,子執行緒使用的引數是乙個引用,mvar的乙個引用,如果主線程先退出,那麼mvar可能被系統**了,那我們在子執行緒中用這個i的話會出問題嗎?(列印位址檢視後經實驗雖然是安全的,但是不建議。)

再看子執行緒中的第二個引數是否安全:

怎麼樣將這個字串mybuf傳遞到執行緒中來呢?

//將上邊myprint函式做修改

上述要注意的問題2是:

thread mytobj(myprint,mvar,mybuf);//啟動這個執行緒的話,我們希望是將mybuf字元陣列轉化成隱式字串,然後我們在string中就可以使用string這個物件,這樣的話執行緒就不會引用主線程也就是main函式中mypuf這段記憶體,那你mybuf這段記憶體,如果你主線程執行完了,銷毀了這段記憶體,也不會影響我pmybuf記憶體的引用。但現在的問題是mypuf在什麼時候轉化為string?比如我這個mian函式都執行完了你才把mypuf往string轉,那就太尷尬了,此時mupuf已經被系統**了(因為mybuf是乙個區域性變數,屬於主線程中的變數),**了就沒有辦法轉了。

需要將主函式中**修改為:

使用mybuf臨時構造了乙個string物件,然後這個string對應myprint中的第二個引數string。為什麼轉化成臨時的string物件就沒有問題了呢?

class a

{public:

int m_i;

a(int a):m_i(a){cout<

執行緒傳參詳解,detach的坑

include include includeusing namespace std 執行緒id 每個執行緒都有一串唯一的數字來標識,這串數字就是執行緒id。可通過std this thread get id 來獲取。detach時 1.如果傳遞int這種簡單型別引數,建議都是值傳遞,不要用引用 可...

c 多執行緒 傳參

向執行緒傳遞引數 1 必要的標頭檔案 include 多線成標頭檔案 include c的stdlib標頭檔案 include 最好不要用 using namespace std 巨集定義 define numthread 5 定義乙個函式,列印hello world,這個函式有傳入值 void p...

c 多執行緒詳解

自我的部落格 atomic flag thread mutex recursive timed mutex 定時遞迴mutex類 lock類 unique lock 與mutex raii相關,方便執行緒對互斥量上鎖,但提供了更好的上鎖和解鎖控制 其他型別 函式 try lock 嘗試同時對多個互斥...