zoukankan      html  css  js  c++  java
  • 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)

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

  • 相关阅读:
    Java web项目部署之SecureCRT+SecureFX的简单使用
    Ubuntu Linux系统用命令安装MySQL数据库
    Linux中操作tomcat的一些命令
    学习Java第二天
    学Java第一天
    在Windows10下在WSL中使用visual studio code
    Makefile中的变量赋值
    我见过的最好的关于typedef函数指针声明的解说
    C语言中打印格式
    Vim常用小操作【持续更新】
  • 原文地址:https://www.cnblogs.com/azbane/p/15335023.html
Copyright © 2011-2022 走看看