std::get<C++11多线程库>(07):向线程函数传递参数(2)
1 /* 实例场景: 2 * 1. std::thread 构造函数的第一个参数为全局函数时,参数的传递。 3 * 传递方式:std::thread第一个参数为全局函数的函数指针, std::thread 从第二个开始的参数,依次传递给全局函数的参数表 4 * std::thread t(func, param1); 5 * std::thread t(func, param1, param2, ..., paramn); 6 * 7 * * * 分别就参数的几种常见形式进行讨论: 8 * 9 * int v(10); 10 * 11 * a) 参数为值类型, 例如 int。 func形参地址与实参地址不同。 12 * void func(int v); 13 * std::thread t(func, v); 14 * 15 * b) 参数为引用类型, 例如 int &。 func形参地址与实参地址相同。 !!!请注意:默认变量类型和自定义类类型的情况并不一样!!! 16 * void func(int& v); 17 * std::thread t(func, std::ref(v)); 18 * 19 * c) 参数为指针类型, 例如 int *。 func形参地址与实参地址相同。 20 * void func(int * v); 21 * std::thread t(func, &v); 22 */
1 //! [1] ====================== *实例场景-1 *================== 2 void func(int a){ //0x27ff934 3 std::cout<<"a: "<<a<<std::endl; 4 } 5 6 void func1(int & ref_a){ //4ffec4 7 std::cout<<"ref_a: "<<ref_a<<std::endl; 8 } 9 10 void func2(int * p_a){ //0x4ffec4 11 std::cout<<"p_a: "<<*p_a<<std::endl; 12 } 13 14 int main(int argc, char *argv[]) 15 { 16 QCoreApplication a(argc, argv); 17 int v = 10; //0x4ffec4 18 19 //参数为值类型:正确写法 20 std::thread _t1(func, v); 21 22 //参数为引用类型:错误写法 23 //error info: C2893:未能使函数模板(unkown-type std::invoke(_Callable &&, _Types &&...)专用化 24 //std::thread _t2(func1, v); 25 //std::thread _t2_move(func1, std::move(v)); 26 27 28 //参数为引用类型:正确写法 29 std::thread _t2_ref(func1, std::ref(v)); 30 31 //参数为指针类型:正确写法 32 std::thread _t3(func2, &v); 33 34 //参数为指针类型:错误写法 35 //error info: C2893:未能使函数模板(unkown-type std::invoke(_Callable &&, _Types &&...)专用化 36 //std::thread _t3_ref(func2, std::ref(v)); 37 //std::thread _t3_move(func2, std::move(v)); 38 39 40 _t1.join(); 41 //_t2.join(); 42 //_t2_move.join(); 43 _t2_ref.join(); 44 _t3.join(); 45 //_t3_ref.join(); 46 _t3_move.join(); 47 48 std::cout<<"...lucky bear..."<<std::endl; 49 return a.exec(); 50 } 51 //! [1]
std::get<C++11多线程库>(07):向线程函数传递参数(3)
原创文章, 转载请注明出处!