为什么我应该使用thread.join使程序运行正常?

时间:2017-01-15 14:38:48

标签: c++ multithreading c++11

#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()来确保程序正常运行?

1 个答案:

答案 0 :(得分:4)

仅仅因为它是由标准强制执行的。在std::thread的析构函数中,

  

如果* this有一个关联的线程(joinable()== true),则调用std :: terminate()。 source

这可以确保所有线程都已完成运行,并且所有相关资源都已正确清理。这不仅限于main。每当线程对象被销毁时,它都不能是可连接的。

如果您想在不加入的情况下销毁线程对象,请参阅std::thread:detatch