C++11向线程函数传递参数
生活随笔
收集整理的這篇文章主要介紹了
C++11向线程函数传递参数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
普通函數 類成員函數
引用傳遞 按值傳遞
這個是std::thread構造函數之一,其中f是可調用對象,args是傳遞給f的參數。
默認傳遞給f的是按值復制,若需要傳遞引用參數給線程函數,則必須包裝它(例如用 std::ref 或 std::cref )。
f類型:
args分類:
普通函數
普通函數的示例如下
//按值傳遞 void FunbyCopy(int num) {++num; } //引用傳遞 void FunbyRef(int & num) {++num; } //測試代碼 int num = 10; //按值傳遞 std::thread task1(FunbyCopy, num); std::cout << "num is " << num << std::endl;//沒有用ref包裝,被認為是按值傳參數,而FunbyRef卻是接受引用的參數,編譯器會報錯 //std::thread task2(FunbyRef, num); //std::cout << "num is " << num << std::endl;//引用傳遞 std::thread task3(FunbyRef, std::ref(num)); std::cout << "num is " << num << std::endl;task1.join(); task2.join(); task3.join();運行結果:
num is 10 num is 11需要說明的是:task2沒有用ref包裝,被認為是按值傳參數,而FunbyRef卻是接受引用的參數,編譯器會報錯?
類成員函數指針
f可以傳遞一個成員函數指針作為線程函數,并提供一個合適的對象指針,之后傳遞的是線程函數的參數。參數形式可以是引用或者按值傳遞。
具體使用如下:
//測試類 class CMath { public:CMath(int _a, int _b) :a(_a), b(_b){}CMath(){}~CMath(){}void add_sum(){sum = a + b;}int get_sum(){return sum;}void set_a(int _a){ a = _a;}void set_b(int _b){ b = _b;}private:int a;int b;int sum; };?測試代碼:
CMath math; //設置值 math.set_a(20); math.set_b(20);//啟動線程計算值 //構造函數的第一個參數是類成員指針,第二個參數是類對象指針 //如果需要給成員指針傳遞參數,則從第三個參數開始 std::thread cal_task(&CMath::add_sum, &math);//等待計算結束 cal_task.join(); //輸出結果 std::cout << "sum is " << math.get_sum() << std::endl;運行結果:
sum is 40注意:對于類成員函數作為線程執行函數時,第一個參數必須是該成員函數所在類的一個對象,否則編譯會報錯,這是因為:第一個參數是?類?的成員函數的地址,沒有經過實例化,所以不是內存中真正的位置,需要配合實例化后的對象的地址才可以一起使用。?
總結
使用類成員函數指針作為線程函數,是以面向對象的方式進行編碼,在復雜類中使用成員函數指針可能會比較方便。如果是簡單的邏輯,使用普通函數的形式就可了。
本文轉自:
C++11向線程函數傳遞參數_Keep Moving~-CSDN博客_c++ 線程傳遞參數
總結
以上是生活随笔為你收集整理的C++11向线程函数传递参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坐火车忘带身份证怎么办?手把手教你使用电
- 下一篇: 华为在巴塞罗那斩获十项行业技术大奖 实在