什么时候调用std :: thread析构函数?

时间:2019-05-26 07:21:55

标签: c++ stdthread

我知道std::thread析构函数是在主出口或线程对象超出范围时调用的。

但是当它所调用的函数完成执行时,它也会被销毁吗?
如果不是这样的线程会发生什么,我还能join()吗?

1 个答案:

答案 0 :(得分:7)

  

但是当它所调用的函数完成执行时,它也会被销毁吗?如果不是这样的线程会发生什么,我还能join()吗?

不,它不会被销毁,但会标记为joinable()。所以是的,您仍然可以join()

否则,从您的问题的标题(“何时调用std :: thread析构函数?” )以及您在帖子中所说的内容

  

我知道std :: thread析构函数是在主出口或线程对象超出范围时调用的。

与其他任何实例一样:当实例超出范围时调用析构函数,或者如果实例是动态分配的,则调用delete

这是一个小的示例代码

#include <thread>
#include <iostream>
#include <chrono>

using namespace std::chrono_literals;

void foo() {
    std::cout  << "Hello from thread!" << std::endl;
}

int main() { 
    std::thread t(foo);
    std::this_thread::sleep_for(1s);
    std::cout << "t.joinable() is " << t.joinable() << std::endl;
    t.join();
}

输出为

Hello from thread!
t.joinable() is 1

live看到它。