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

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

  • 相关阅读:
    android常用的Application类
    Android一些问题的解决方案
    MakeFile相关
    Android源码与设计模式之notifyDataSetChanged()方法与观察者模式
    Activity启动模式与onNewIntent()简述
    (转)eval与迭代
    ADB命令
    其他常用工具类
    文件操作常用工具方法
    [TJOI2007] 可爱的质数
  • 原文地址:https://www.cnblogs.com/azbane/p/15335070.html
Copyright © 2011-2022 走看看