为线程传递多个参数

我们知道,线程的创建方式有三种:通过函数入口创建,通过类对象创建,通过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 }
 
  
 
 

输出:

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

猜你喜欢

转载自www.cnblogs.com/leoncumt/p/10505701.html