С++ std::thread должен быть создан в куче или в стеке

Допустим, у меня есть поток, который создается и отделяется от стека следующим образом:

void foo()
{
    while(true){};
}

void runThread()
{
    std::thread t(foo);
    t.detach();
}

int main()
{
    runThread();
}

Программа, конечно, ничего не значит, но что произойдет после того, как мы отсоединим и выйдем из runThred? он был размещен в стеке, поэтому в основном t будет уничтожен после выхода из runThred, но сам поток будет продолжать работать независимо от основного потока, потому что он отсоединен.

Является ли наилучшей практикой в ​​​​таком примере создание его в куче и сохранение указателя на то, что он делает после этого (dcor)?

Или это ничего не значит, если переменная t уничтожена, и мы должны просто «игнорировать» ее?


person Itzik984    schedule 09.02.2016    source источник
comment
Зачем вам держать указатель на него? Как только вы позвоните detach, вы больше не являетесь владельцем потока.   -  person NathanOliver    schedule 10.02.2016
comment
так что же происходит с «т»? его убивают, но это ничего не значит?   -  person Itzik984    schedule 10.02.2016
comment
Вам следует прочитать документацию. Это объясняет, как это работает.   -  person NathanOliver    schedule 10.02.2016
comment
как только вы отсоедините t, это зомби. его уничтожение - это NOP.   -  person Richard Hodges    schedule 10.02.2016
comment
Вы должны очень четко различать, когда вы говорите об объекте std::thread и когда вы говорите о самом потоке (то, что запланировано и выполняет код).   -  person David Schwartz    schedule 10.02.2016
comment
@DavidSchwartz Спасибо за ваш комментарий, так что это в основном означает, что «t» не имеет отношения к выполнению потока, его следует использовать только для части отсоединения. правильно ли я понял?   -  person Itzik984    schedule 10.02.2016
comment
@ Itzik984 Itzik984 После вызова detach связь между объектом std::thread и потоком отсутствует.   -  person David Schwartz    schedule 10.02.2016
comment
Спасибо @DavidSchwartz. не могли бы опубликовать ответ с кратким объяснением, чтобы я мог его принять?   -  person Itzik984    schedule 10.02.2016
comment
std::thread t(foo()) должно быть std::thread t(foo)   -  person user253751    schedule 10.02.2016
comment
@immibis спасибо, исправлю   -  person Itzik984    schedule 10.02.2016
comment
Стоит добавить, что после того, как вы отсоединились от потока, ничто не препятствует возврату main и завершению программы, что может привести к бесцеремонному уничтожению потока до того, как поток завершит выполнение.   -  person user4581301    schedule 10.02.2016
comment
Избегайте отрыва нитей. Не создавайте std::thread объектов в куче, если вам нужно передать их в другую область, std::move их. Совет: храните объекты std::thread в файле std::vector.   -  person Galik    schedule 28.02.2019


Ответы (1)


Объект std::thread представляет собой дескриптор потока, через который он может работать. Но как только вы вызываете detach, связь между объектом и фактическим потоком выполнения отсутствует.

person David Schwartz    schedule 09.02.2016