三、线程传参、detach大坑、成员函数做线程函数

一、传递临时对象作为线程参数

每个线程要给他一个编号,不同编号做不同任务。

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

扫描二维码关注公众号,回复: 6840218 查看本文章

4、临时对象构造时机抓捕

三、传递类对象、智能指针作为线程参数

四、成员函数指针做线程参数

猜你喜欢

转载自www.cnblogs.com/pacino12134/p/11228024.html