Но уничтожается ли он также, когда выполняемая функция вызывает выполнение?Если нет, что происходит с такой нитью, могу ли я все еще join()
это?
Нет, она не уничтожена, а помечена joinable()
.Так что да, вы все равно можете join()
it.
В противном случае, как указано в заголовке вашего вопроса ( "Когда вызывается деструктор 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 .