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)

原创文章, 转载请注明出处!

原文地址:https://www.cnblogs.com/azbane/p/15335070.html