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

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

被折叠的 条评论
为什么被折叠?



