(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 嘗試同時對多個互斥...