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

mik*_*kol 6 c++ stdthread

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

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

πάν*_*ῥεῖ 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();
}
Run Code Online (Sandbox Code Playgroud)

输出是

Hello from thread!
t.joinable() is 1
Run Code Online (Sandbox Code Playgroud)

现场观看。