背景:
最近学习下多线程,无意看到一篇博文,其中有一段自己尝试运行,发现一些问题,请教下各位。当然,作为新手,有些可能是自己理解错误的地方,也希望大家指出,先谢谢各位。
提出问题:
①.线程是根据所在函数块退出而退出吗?
例如:文中主线程在main()结束return 0退出而退出,子线程在fn函数执行完毕后体退出。(这里可能是最大的误区,因为之前似乎看过这种理论,但是想找找不到了- -.)
自己的推论依据:
下面代码也是和文章有出入的地方。首先,如果没有加上cin.get()进行暂停,代码会直接退出,没有输出结果。(我的看法是主线程和子线程分离后,主线程执行return 0直接退出了,所以没有输出。)
这里也引申了另一个问题,控制台不会给子线程输出结果吗,如果主线程退出了的话?(或者有什么方法可以在主线程即使退出了也能查看子线程的输出)
当我加上cin.get()后(好像就变成了和t.join一样主线程等待分线程退出了欸),但输出就是正确输出(10个100),并不像图中说的*a将成为野指针,图片控制台的输出也没有。
图片文章中理论我大概明白了,但是结果却不近人意,似乎局部变量a地址没有销毁,*a一直输出正确的答案啊?
代码
测试环境:VS2017、Ubuntu -std=c++11。
(代码也不知道是不是这样写 0.0,也尝试了将fn放在main内部,lambda的captures调用fn,结果似乎一致)
#include <iostream>
#include <thread>
using namespace std;
auto fn = [](int *a) {
for (int i = 0; i < 10; i++)
cout << *a << endl;
};
int main() {
[] {
int a = 100;
thread t(fn, &a);
t.detach();
}();
cin.get();
return 0;
}
从 main 返回会导致
std::exit()
被调用(从其他线程函数返回没有这个效果)。std::exit
会终止整个程序,即使还有其它线程在运行。