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,傳遞到可調用函數中的也是對這個副本的引用©data,那么函數體內對實參的改變也只是對內存中的副本進行了改變,而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 }