c 11執行緒間引數傳遞

2022-03-26 02:27:59 字數 2691 閱讀 5992

建立的工作執行緒不止乙個,執行緒根據編號來確定工作內容。每個執行緒都需要知道自己的編號。執行緒中有很多容易犯錯的寫法

例子1多執行緒需要執行的函式:

voidmy_print(constint&i,char* p_mybuff)

主函式的寫法

intmvar = 1;

int& mvary = mvar;

charmybuf ="this is a test!";

threadmyobj(my_print, mvar, mybuf);

myobj.join();

cout <<"main thread!!!"<< endl;

解釋:注意陷阱!!!引用和指標的變數傳參。

引用:表面看起來似乎正確,但是細節上有很多地方需要注意的,如果把join()改成detach(),然後主線程和子執行緒分別執行,那麼可能出現主線程執行完了,但是傳遞進去的引數(引用形式)的資源已經被釋放了,有沒有可能出現錯誤?:

myobj.detach()

在建立thread物件的時候,做了乙個複製,把值複製進去了,所以不是乙個真引用,實際是值傳遞,不會出現資源釋放的錯誤。但是反過來想,那麼主線程的變數的值並不會改變。

正確的用法是什麼樣:不傳引用,如果要傳字串的情況。

char* p_mybuff 改成 const string &p_mybuff ,確實不指向於同一塊記憶體,什麼時候出現了變數型別的轉換?事實上存在主函式執行完了,p_mybuff 都被**了,系統才用p_mybuff 去轉換string

threadmyobj(my_print, mvar, string(mybuf));

如果用乙個string 去強制型別轉換,生成乙個臨時物件,此時的臨時物件會繫結到p_mybuff上。在建立執行緒的時候,構造臨時變數的方法傳遞引數是可行的,此時也會呼叫一次建構函式,此時detach也能正確執行。為了防止主線程退出,子執行緒記憶體的非法引用。

1) 對傳遞int,直接用值傳遞。

2) 如果傳遞類物件,避免隱式型別轉換。全部都在建立執行緒的時候就構建出臨時物件,在函式引數裡用引用來接收傳遞的函式。否則系統還會多構造一次函式,造成不必要的浪費。

3) 主線程中型別轉換,那麼a(mysecondpar) 這一步由主線程操作

thread myobj(myprint, mvar, a(mysecondpar));

thread myobj(myprint, mvar, mysecondpar);

4) 建議不使用detach,用join

傳參函式給執行緒的時候,引數入口都是const,在函式中const不能修改,如果需要修改變數,就在初始化的時候「mutable」。在c++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,但是在多執行緒裡面也有問題,如果真的要修改值,那麼就使用std:ref(),這個ref和在c#裡面是類似的,將方法內的變數改變後帶出方法外,用std:ref(),真正地把變數傳進去。

完整的**:

#include "pch.h"

#include

#include

usingnamespacestd;

classperson

person(constperson &p) :m_age(p.m_age)

~person()

};

voidmyprin(constint&num,char*p)

voidprint_class(person p)

intmain()

將類的成員函式傳遞到執行緒中。

std::threadmyobj(&classa::method, para1, para2,..);

myobj.join();

classa::method就是乙個函式。

C 11多執行緒thread引數傳遞問題

僅僅是構造乙個執行緒類,但沒有和具體化的執行緒函式關聯 thread noexcept 移動建構函式 thread thread other noexcept 構造新的 std thread 物件並將它與執行執行緒關聯 template class function,class.args expli...

C 執行緒間傳遞引數

我們如果定義不帶引數的執行緒,可以用threadstart 帶乙個引數的用parameterizedthreadstart。帶多個引數的用另外的方法,下面逐一講述。一 不帶引數的 c sharp view plain copy using system using system.collection...

C 11多執行緒學習 執行緒函式的引數傳遞

執行緒引數傳遞要記住乙個重要的事情,傳遞的引數是存在新執行緒乙個內部的轉存站中,之後在函式執行的時候再傳遞給函式本身的。這種機制會引發兩個問題 1.臨時引數的未及時構造 void f int i,std string const s void oops int some param 雖然函式f的第二...