std::thread析构函数何时被调用?

6
我知道std::thread析构函数会在主函数退出时被调用,或者当线程对象超出作用域时被调用。
但是,如果它正在调用的函数执行完成后,它是否也会被销毁? 如果不会,这样的线程会发生什么情况?我能否仍然join()它?
1个回答

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

点击此处查看实时演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接