detach收尾時傳遞臨時物件作為執行緒引數

2021-09-25 10:04:36 字數 1351 閱讀 9904

//一般情況下,我們使用join()收尾不會顯得那麼複雜

1 #include2 #include3 using namespace std;

4 void fun(const int &v,char*buff)

5 {6 cout<一.傳遞臨時物件作為執行緒引數,而不是指標

當我們使用的是detach()來作為整個程序的收尾,如果我們引數傳遞引用或者指標

會有什麼問題?

1 #include2 #include3 using namespace std;

4 5 void fun(const int &v,char*buff)

6 {

7 cout<總結一下:detach():

在thread()給子執行緒函式傳遞引數時,如果使用引用,內部會講這個引用指向的記憶體中的東西拷貝到子執行緒的記憶體中,所以使用引用一般不會有什麼問題;

但是,使用指標卻不一樣,是直接將主線程這塊記憶體的位址傳遞給子執行緒函式,並不會像引用一樣會進行記憶體中內容的拷貝,所以,使用detach()一定不能使用指標作為引數;

那麼如何解決不能使用傳遞指標和避免使用引用的問題: 傳遞臨時物件

在以前寫c++**時,都是時刻避免臨時物件的產生,因為影響效率,

但是這裡就有點特殊,給子執行緒函式傳遞引數的時候使用臨時物件,而不是引用或者指標.buhuishixiao

解決方案一:

實參傳遞乙個字串,形參用const string &buf接受,這樣就會構造乙個string物件,

即使主線程退出,子執行緒訪問字串也是自己在子執行緒的記憶體上.

void fun(const int &v,const string &buff)

{

cout《也就是說,解決方案一也是存在問題的,也是乙個bug,解決方案二:

傳遞實參的時候,就將引數轉換成臨時物件,然後進行傳遞

void fun(const int &v,const string &buff)

{

cout<總結:

在建立執行緒的的同時,建立引數的臨時物件進行傳遞引數方式是可行的.

用臨時物件給子執行緒函式傳遞引數,就一定可以在detach後成功正確的使用引數記憶體,變數就不會失效,主線程退出後變數不會失效.

建議:對於傳遞簡單的int這樣的型別,建議直接使用字面值傳遞.;

如果傳遞物件,避免隱士的型別轉換,全部在建立執行緒thread()這行**中將臨時物件構建出來

形參接受的時候使用引用

如果使用join()就不存在這些問題了.

載入module時傳遞引數

自從 flex3 開始就加入了 module 在工程中使用 module 可以減少生成的 swf的大小,或者可以動態新增系統的功能。使用起來非常方便,相對於使用 swfloader moduleloader 用起來更加方便。在使用moduleloader 和module 時總會遇到在載入 modul...

Intent傳遞資料時,可以傳遞哪些型別資料?

在android應用的開發中,如果我們需要在不同的模組 比如不同的activity之間 之間傳遞資料,通常有以下兩種方法 1.利用intent物件攜帶資料 通過查詢intent bundle的api文件,我們可以獲知,intent bundle支援傳遞基本型別的資料和基本型別的陣列資料,以及stri...

函式的引數傳遞位陣列時,如何傳遞

初學者剛學完陣列後,需要將陣列作為引數傳遞時,會直接將陣列作為引數傳遞,實際上陣列作為形參傳遞時,是以指標傳遞的。void print int a void print int a 儘管形式不同,但是上面兩個函式是等價的,每個函式的唯一形參都是 int 型別 void print const cha...