Допустим, у меня есть поток, который создается и отделяется от стека следующим образом:
void foo()
{
while(true){};
}
void runThread()
{
std::thread t(foo);
t.detach();
}
int main()
{
runThread();
}
Программа, конечно, ничего не значит, но что произойдет после того, как мы отсоединим и выйдем из runThred
? он был размещен в стеке, поэтому в основном t
будет уничтожен после выхода из runThred
, но сам поток будет продолжать работать независимо от основного потока, потому что он отсоединен.
Является ли наилучшей практикой в таком примере создание его в куче и сохранение указателя на то, что он делает после этого (dcor)?
Или это ничего не значит, если переменная t
уничтожена, и мы должны просто «игнорировать» ее?
detach
, вы больше не являетесь владельцем потока. - person NathanOliver   schedule 10.02.2016t
, это зомби. его уничтожение - это NOP. - person Richard Hodges   schedule 10.02.2016std::thread
и когда вы говорите о самом потоке (то, что запланировано и выполняет код). - person David Schwartz   schedule 10.02.2016detach
связь между объектомstd::thread
и потоком отсутствует. - person David Schwartz   schedule 10.02.2016std::thread t(foo())
должно бытьstd::thread t(foo)
- person user253751   schedule 10.02.2016main
и завершению программы, что может привести к бесцеремонному уничтожению потока до того, как поток завершит выполнение. - person user4581301   schedule 10.02.2016std::thread
объектов в куче, если вам нужно передать их в другую область,std::move
их. Совет: храните объектыstd::thread
в файлеstd::vector
. - person Galik   schedule 28.02.2019