執行緒傳參詳解,detach的坑

2021-09-27 13:45:03 字數 1009 閱讀 5934

#include #include#includeusing namespace std;

//執行緒id:每個執行緒都有一串唯一的數字來標識,這串數字就是執行緒id。可通過std::this_thread::get_id()來獲取。

//detach時

//1.如果傳遞int這種簡單型別引數,建議都是值傳遞,不要用引用(可能會發生呼叫已釋放的記憶體的情況)

//2.如果傳遞類物件,避免隱式型別轉換,在建立執行緒時就構造臨時物件,然後在函式引數裡,最好用引用來接。(否則會拷貝構造兩次)

//建議少使用detach,多使用join,這樣就不存在區域性變數失效導致執行緒對記憶體非法訪問的問題

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

void myprint(const int i, const string pmybuf) //這樣修改後可避免指向相同位址的問題,但在char陣列轉為string前可能就被系統**了(主線程執行完畢)

int main()

; thread mytobj(myprint, mvar, mybuf); //事實上,detach時,存在mybuf都被**了(main函式執行完了),系統才用mybuf去轉string的可能性(因為是在子執行緒中構造string物件)

thread mytobj(myprint, mvar, string(mybuf)); //直接將mybuf轉換為string臨時物件,這樣可以保證執行緒中的mybuf一定有效(主線程中構造string物件,穩定)

thread mytobj(myprint, mvar, std::ref(mybuf)); //這樣執行緒引用中的修改的值可影響到主線程的值(兩個位址相同,不呼叫拷貝建構函式,那麼detach時可能就會不安全(記憶體非法訪問)) std::ref(mybuf)==&mybuf

mytobj.detach();

cout << "主線程執行1" << endl;

return 0;

}

方法傳參詳解

1 string str hello 在棧中存的是對應常量池中的位址 2 處於節省記憶體的考慮,jvm會快取 128到127的integer物件,但是現在num 200,不在範圍內,所以會建立乙個新物件 3 int arr在棧中存的也是位址 4 mydata my在棧中存的也是位址 方法的引數傳遞機...

golang函式傳參詳解

golang中的基本型別分為值型別和引用型別 參考go中的值型別和引用型別 1.值傳遞 2.引用傳遞 注 golang函式傳參都是以複製變數的方式,不支援引用的方式 特殊的是 go語言閉包函式對外部變數是以引用的方式使用 參考由 go語言閉包函式對外部變數是以引用的方式使用 引發的閉包 摘自go語言...

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

1 傳遞臨時物件作為執行緒引數 2 傳遞類物件智慧型指標作為執行緒引數 3 用成員函式指標做執行緒函式 在實際工作中我們要建立的執行緒可能不止乙個,比如說我們要建立10個,編號從0到9,這10個執行緒會根據自己的編號確定自己要幹的事情,這個執行緒如何知道自己的編號呢,這個就需要我們給執行緒傳遞引數 ...