我们知道,线程的创建方式有三种:通过函数入口创建,通过类对象创建,通过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 }
输出:
可以看到,我们创建线程的同时传入了一个类的对象,使用引用来接收对象,故而不存在问题。