【发布时间】:2016-05-20 03:42:52
【问题描述】:
假设我有一个线程正在堆栈上创建和分离,如下所示:
void foo()
{
while(true){};
}
void runThread()
{
std::thread t(foo);
t.detach();
}
int main()
{
runThread();
}
该程序当然没有任何意义,但是在我们分离并退出 runThred 之后会发生什么?它是在堆栈上分配的,所以基本上t 将在我们退出runThred 后被销毁,但线程本身将继续运行,无论主线程如何,因为它已分离。
这种示例中的最佳做法是在堆上创建它并保存一个指向它的指针,然后做任何事情(dcor)吗?
或者如果 t 变量被破坏并且我们应该“忽略”它,这意味着什么?
【问题讨论】:
-
为什么要保留指向它的指针?一旦您致电
detach,您就不再拥有该线程。 -
那么“t”会发生什么?它被杀死了,但它没有任何意义?
-
您应该阅读documentation。它解释了这是如何工作的。
-
一旦你分离
t,它就是一个僵尸。摧毁它是一个 NOP。 -
std::thread t(foo())应该是std::thread t(foo)
标签: c++ multithreading heap-memory stack-memory detach