std::get<C++11多线程库>(07):向线程函数传递参数(1)
1 #include <QCoreApplication> 2 #include <iostream> 3 #include <thread> 4 #include <typeinfo> 5 #include <assert.h> 6 7 /* 8 * 话题1: 向线程函数传递参数 9 * 1. 向 std::thread 构造函数中的可调用对象,或者函数传递参数是很简单的事情。 10 * 2. 默认参数要拷贝到线程独立内存中,即使参数是引用的形式。 11 * (理解批注: 默认情况下,参数要拷贝到线程独立~~~) 12 * 3. 当参数为引用类型时,想得到 “引用”效果,而非 “第2点”所言, 则需要使用 std::ref()。 13 * 14 * 15 * 实例场景: 16 * 1. std::thread 构造函数的第一个参数为全局函数时,参数的传递。 17 * 传递方式:std::thread第一个参数为全局函数的函数指针, std::thread 从第二个开始的参数,依次传递给全局函数的参数表 18 * std::thread t(func, param1); 19 * std::thread t(func, param1, param2, ..., paramn); 20 * 21 * * * 分别就参数的几种常见形式进行讨论: 22 * 23 * int v(10); 24 * 25 * a) 参数为值类型, 例如 int。 func形参地址与实参地址不同。 26 * void func(int v); 27 * std::thread t(func, v); 28 * 29 * b) 参数为引用类型, 例如 int &。 func形参地址与实参地址相同。 !!!请注意:默认变量类型和自定义类类型的情况并不一样!!! 30 * void func(int& v); 31 * std::thread t(func, std::ref(v)); 32 * 33 * c) 参数为指针类型, 例如 int *。 func形参地址与实参地址相同。 34 * void func(int * v); 35 * std::thread t(func, &v); 36 * 37 * 2. std::thread 构造函数的第一个参数为成员函数时,参数的传递。 38 * 传递方式:std::thread第一个参数为成员函数的函数指针, std::thread 从第二个开始的参数,依次传递给成员函数的参数表 39 * Obj obj; 40 * std::thread t(&Obj::func, &obj, param1); 41 * std::thread t(&Obj::func, &obj, param1, param2, ..., paramn); 42 * 43 * * * 分别就参数的几种常见形式进行讨论: 44 * 45 * Object obj; 46 * Param param(10); 47 * 48 * a) 参数为值类型, 例如 Param。 func形参地址与实参地址不同,发生了: 拷贝构造+移动构造。 49 * std::thread t(&Object::func, &obj, param); 50 * 51 * b) 参数为引用类型, 例如 Param &。 func形参地址与实参地址分两种方式而不同 !!!请注意:默认变量类型和自定义类类型的情况并不一样!!! 52 * b-1) 默认方式 53 * std::thread t(&Object::func, &obj, param); 形参地址与实参地址不同, 发生了:拷贝构造。 54 * 55 * b-2) std::ref() 方式 56 * std::thread t(&Object::func, &obj, std::ref(param)); 形参地址与实参地址相同, 未发生拷贝构造,未发生移动构造 57 * 58 * c) 参数为指针类型, 例如 int *。 func形参地址与实参地址相同,未发生拷贝。 59 * std::thread t(&Object::func, &obj, ¶m); 60 * 61 * 拓展1:线程参数的传递流程如下: 62 * 1. 参数被拷贝到线程的独立内存中; 63 * 2. 独立内存中的变量拷贝到线程执行函数参数列表; 64 * 65 * 问-思考: 66 * 1. std::thread 构造函数的第一个参数为重载函数时, 如何决定哪一个重载函数才是我们想要调用的? 67 * 68 * 2. std::thread 构造函数执行时,不同的参数类型在传递时,都发生了什么事情?比如:值类型,引用类型,指针类型 69 * 70 * 3. “移动”前后, 变量的地址发生了变化吗? 71 */
std::get<C++11多线程库>(07):向线程函数传递参数(2)
原创文章, 转载请注明出处!