关于C++多线程的一些疑惑
背景:
最近学习下多线程,无意看到一篇博文,其中有一段自己尝试运行,发现一些问题,请教下各位。当然,作为新手,有些可能是自己理解错误的地方,也希望大家指出,先谢谢各位。
提出问题:
①.线程是根据所在函数块退出而退出吗?
例如:文中主线程在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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
从 main 返回会导致
std::exit()
被调用(从其他线程函数返回没有这个效果)。std::exit
会终止整个程序,即使还有其它线程在运行。这个问题跟线程关系不大,先解决你为啥*a一直输出正确结果的问题
因为内存释放,不像你想的一样,释放了这一块内存就全是0或者全是0xff了,也不会不让你访问了
内存释放是标记这一段内存为可用内存,除非你指定,否则其值暂时是不会改变的,当有新的内存申请时,这部分内存可能会随时被利用
所以,a确实释放了,但是内存还没来得及变,你依然可以访问这一块内存,按照int*来获取之前付给这一部分内存的值
但是一定要注意,这在c/c++是非常危险的操作,请一定不要这样访问已经释放的变量