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, &param);
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)

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

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