Когда вызывается деструктор std :: thread? - PullRequest
6 голосов
/ 26 мая 2019

Я знаю, что деструкторы std::thread вызываются на главном выходе или когда объект потока выходит из области видимости.

Но уничтожается ли оно и тогда, когда выполняется вызываемая функция?
Если нет, что происходит с таким потоком, могу ли я все же join() это?

1 Ответ

7 голосов
/ 26 мая 2019

Но уничтожается ли он также, когда выполняемая функция вызывает выполнение?Если нет, что происходит с такой нитью, могу ли я все еще 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 .

...