c++ 学习之 多线程(四)再谈 join 与 detach
前言
在之前的学习中,我们初步了解了join与detach的作用,但是当实际应用的时候,有很多地方需要注意,不然总会发生一些意想不到的事情发生,下面我们来说一说join与detach的坑。
正文
1.实参传递问题
问题场景:
当我们用主线程中的局部变量当作实参去初始化thread对象后,调用detach将子线程与主线程分离开,并且主线程在子线程之前结束。
后果:
主线程结束后,主线程内的局部变量将会被释放,但是子线程中仍在使用相应内存空间的内容,这就会出现问题。
解决办法:
用值传递来初始化thread对象,这样相应的变量会被拷贝一份传进子线程中,其拷贝出来的变量的作用域为子线程,主线程结束后,资源释放不会对其造成影响。
若必须传递实参时,应确保子线程在主线程之前结束,或使用join(),让主线程等待子线程结束。
问题场景:
当我们向线程中传递引用时,往往起不到引用的效果,这时候我们需要注意我们传递的是否真的是这个变量的引用呢?
#include<stdio.h>
#include<thread>
using namespace std;
void fun(const int &a)
{
printf("子线程中a的地址 :%p\n", &a);
}
int main()
{
int a = 0;
printf("主线程中a的地址 :%p\n", &a);
thread t(fun,a);
t.join();
}
输出结果:
主线程中a的地址 :00F3FAB8
子线程中a的地址 :0113EFC8
可以看到这样传递的引用并不是真正的引用,还是一个值传递。
解决办法:
#include<stdio.h>
#include<thread>
using namespace std;
void fun(const int &a)
{
printf("子线程中a的地址 :%p\n", &a);
}
int main()
{
int a = 0;
printf("主线程中a的地址 :%p\n",