我知道std::thread
析构函数是在主出口或线程对象超出范围时调用的。
但是当它所调用的函数完成执行时,它也会被销毁吗?
如果不是这样的线程会发生什么,我还能join()
吗?
答案 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看到它。