一、传递临时对象作为线程参数
每个线程要给他一个编号,不同编号做不同任务。
1、陷阱1
1 #include <iostream> 2 #include <thread> //线程 3 using namespace std; 4 5 void prt(const int &i,char *buf){ 6 cout << i<<endl; 7 cout << buf << endl; 8 } 9 int main(){ 10 int& a=1; 11 int& b=a; 12 char mybuf[]="this is a test"; 13 thread myobj(prt,a,mybuf);//第一个参数是线程函数名,接下来的就是线程函数的参数 14 myobj.detach(); 15 cout<<"main end"<<endl; 16 return 0; 17 }
上面代码中线程函数的有个参数是引用参数i。在12行代码中创建子线程是传入的参数是引用了a,所以这个线程函数中i的第一应该是个a的地址相同的。
如果主线程先执行完了,那么a就被释放了,那子线程中访问i的时候,是否会出错?
答案是不会的,虽然创建子线程是i是a的引用,但是实际上,创建线程时,是复制了一份给线程myobj,这里的引用并不是真正的应用,而是复制,引用时不起作用的。所以i还是可以被子线程访问的,因为a复制了一份给i,i的地址与a不同。
但是对于mybuf这个字符串来说,是不安全的。因为buf是指针,内容是指向内存的地址,就算是复制,它指向内存地址内容复制了一遍而已,当主线程执行完了,这个地址指向的内存已经释放了,所以是访问不了的,会出错的!
那如何传递字符串呢????看陷阱二
2、陷阱2
3、线程id
4、临时对象构造时机抓捕
三、传递类对象、智能指针作为线程参数
四、成员函数指针做线程参数