• 为线程传递多个参数


    我们知道,线程的创建方式有三种:通过函数入口创建,通过类对象创建,通过lambda表达式创建。

    在创建线程的同时,可以同时传递多个参数,传参方式有以下几种:

    1.传入函数参数

     1 //1.传递函数参数
     2 void print1(int i,const char *ptr){
     3     cout << "参数是通过Thread对象传递进来的" <<i<<*ptr<< endl;
     4 }
     5 
     6 
     7 
     8 int main()
     9 {
    10     //Father *fa = new Child1();
    11     //delete fa;
    12     ////Child1 ch;
    13     int num = 10;
    14     char arr[10] = { 'a','b' };
    15     thread mytobj(print1, num, arr);
    16     mytobj.join();
    17     cout << "主线程执行完了" << endl;
    18 }

    可以看到,使用join()函数,让主线程等待子线程执行完毕,主线程再输出。join的好处是使程序受我们自己控制。输出是:

    2.传入类对象

    
    
     1 class ArgThread {
     2 private:
     3     int m_num;
     4 public:
     5     //构造函数
     6     ArgThread(int num) :m_num(num) {
     7         cout << "创建线程的同时传入类的私有成员变量" << this << "    " << num << endl;
     8     }
     9     //拷贝构造函数
    10     ArgThread(const ArgThread &AT) {
    11         cout << "拷贝构造函数执行" << this << "      " << endl;
    12     }
    13     //拷贝赋值函数
    14     ArgThread* operator=(const ArgThread &AT) {
    15         this->m_num = AT.m_num;
    16         return this;
    17     }
    18     //为多线程对象重载运算符()
    19     void operator()(int p_num,string str) {
    20         cout << "线程的入口函数" << this << "     " << p_num << str.c_str()<<endl;
    21     }
    22     void print3() {
    23         cout << "通过线程中的对象调用的成员函数" << endl;
    24     }
    25 };
    26 
    27 void print2(int i, ArgThread &at) {
    28     at.print3();
    29     cout << "参数是通过Thread对象传递进来的" << i << &at << endl;
    30 }
    31 
    32 int main()
    33 {
    34     //Father *fa = new Child1();
    35     //delete fa;
    36     ////Child1 ch;
    37     int num = 10;
    38     char arr[] = "good boy!!!!";
    39     /*thread mytobj(print1, num, arr);
    40     mytobj.join();*/
    41     ArgThread AT(num);
    42     thread mytobj(print2,num,std::ref(AT));
    43     mytobj.join();
    44     cout << "主线程执行完了" << endl;
    45 }
    
    
    
    
    

    输出:

    可以看到,我们创建线程的同时传入了一个类的对象,使用引用来接收对象,故而不存在问题。

  • 相关阅读:
    刨析js代码执行机制
    H5离线缓存基础系列
    meta 详解
    如何成长为一名合格的web架构师?
    整理的互联网公司面试趋势
    http协议
    前端现在到底需要什么样的人才
    webpack 4.0 版本的简单使用
    vue的懒加载如何实现?
    Runtime的几个小例子(含Demo)
  • 原文地址:https://www.cnblogs.com/leoncumt/p/10505701.html
Copyright © 2020-2023  润新知