47 C++ 多线程 ------ thread.detach() 的坑点

本文讨论了C++中detach()函数的作用,强调了在子线程与主线程分离后,如何正确处理参数传递,尤其是值传递与引用的区别。同时提到了指针、类型转换和隐式转换在detach场景下的潜在问题。

detach()函数的作用:

主线程不和子线程汇合了;

子线程原本关联的主线程,现在就不在和主线程关联了,这个子线程就会驻留在后台运行;

该子线程会被C++运行时库接管,当子线程执行完毕后,由运行时库(实际上是守护线程,这个要知道linux的一些相关进程线程的知识才懂,如果不懂,就大致理解为有人接管就可以了)清理该线程相关资源

detach()函数的作用的坑点在未验证前自己想:可能发生的问题

从上面的detach的作用,我们就能看到问题点。由于主线程 和 子线程分离了,那么传递参数的时候就要特别注意了。

如果从主线程传递的参数,不是值传递,而是指针,引用;;;

那么在主线程早于子线程完成的时候,子线程用的这个地址还存在吗?

如果不存在了,代码就有问题了

detach函数坑点的总结:

从上一节的代码例子中我们将普通类型值的传递,C++自带类(string)的值传递,自定义类的值传递,普通类型引用的传递,C++自带类(string)的引用传递,自定义类的值引用传递,普通类型值的ref(引用)传递,C++自带类(string)的ref(引用)传递,自定义类的ref(引用)传递,做了测试,发现如下规律:

尽量值传递,不要用引用。虽然在VS2017下,没有问题,但是还是不建议用,因为不知道在其他编辑器上有没有问题。

正常引用也会被 thread 拷贝一份,因此引用传递也不会改变 实参的值。

如果一定要用引用,从前面的例子来看,加上ref(T t)才是真的改变实参值的方法。

那么传递的如果是指针呢?--不行

通过代码在 join()下验证,发现,传递的指针在子线程和主线程的值都一样。

这意味着,在detach()下,从主线程new 出来的int空间,当主线程先执行完毕后,这块空间就被销毁了,如果这时候 子线程还在用,就会有问题。

class 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值