【问题标题】:C++ std::thread should be created on heap or on stackC++ std::thread 应该在堆或堆栈上创建
【发布时间】: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


【解决方案1】:

std::thread 对象代表线程的句柄,通过它可以对其进行操作。但是一旦你调用detach,对象和实际的执行线程之间就没有任何联系了。

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多