c++線程傳參問題


std::thread可以和任何可調用類型一起工作,可調用對象和函數帶有參數時,可以簡單地將參數傳遞給std::thread的構造函數

例如:

 1 #include<iostream>
 2 #include<thread>
 3 using namespace std;
 4 void hello(int a)
 5 {
 6 cout<<a<<endl;
 7 }
 8 
 9 int mian()
10 {
11 int a=10;
12 thread t(hello,a);
13 t.join();
14 }

單重要的是,參數會以默認的方式復制到內存空間,即內存中存儲的是參數的副本,在那里新創建的線程可以訪問他們,而不是訪問源參數

這就會帶來一個問題,即當調用的函數參數為引用類型時,參數的值在函數體內改變時,希望源數據的值也發生改變,但實際情況是源數據值並不會發生。因為將data傳遞給線程的構造函數時,線程訪問的是其在內存中的副本copydata,傳遞到可調用函數中的也是對這個副本的引用&copydata,那么函數體內對實參的改變也只是對內存中的副本進行了改變,而data並沒有發生改變。當線程完成時,隨着所提供參數副本的銷毀,這些改變都將舍棄。

例如:

 1 #incldue<iostream>
 2 #include<thread>
 3 using namespace std;
 4 void hello(int &a)
 5 {
 6 a+=1;
 7 }
 8 
 9 int main()
10 {
11 int a=10;
12 thread t(hello,a);
13 t.join();
14 cout<<a<<endl;               //結果為10,而不是11
15 }

解決方法:用std::ref來包裝引用類型的參數

#incldue<iostream>
 2 #include<thread>
 3 using namespace std;
 4 void hello(int &a)
 5 {
 6 a+=1;
 7 }
 8 
 9 int main()
10 {
11 int a=10;
12 thread t(hello,ref(a));
13 t.join();
14 cout<<a<<endl;               //結果為11
15 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM