#include<thread>
#include<iostream>
#include<windows.h>
using namespace std;
int a;
void func1(void* vp) {
a++;
}
void func2(void* vp) {
cout << a << endl;
}
int main() {
for (;;) {
thread t1(func1, nullptr);
thread t2(func2, nullptr);
t1.join();//cannot delete
t2.join();
Sleep(500);
}
}
如果删除代码:
t1.join();
t2.join();
程序将出现中止错误。
我知道t1.join意味着主线程正在等待线程t1完成所有代码。但为什么我必须使用t1.join()来确保程序正常运行?
答案 0 :(得分:4)
仅仅因为它是由标准强制执行的。在std::thread
的析构函数中,
如果* this有一个关联的线程(joinable()== true),则调用std :: terminate()。 source
这可以确保所有线程都已完成运行,并且所有相关资源都已正确清理。这不仅限于main
。每当线程对象被销毁时,它都不能是可连接的。
如果您想在不加入的情况下销毁线程对象,请参阅std::thread:detatch。