【问题标题】:Do C++11 threads provide a way for detached threads to continue after the main thread exits?C++11 线程是否为分离的线程在主线程退出后继续提供了一种方式?
【发布时间】:2016-11-01 15:21:54
【问题描述】:

通常,当main() 退出时,所有线程都会被杀死。 pthread_exit(3)

为了让其他线程继续执行,主线程应该通过调用 pthread_exit() 而不是 exit(3) 来终止。

是否有等效的 C++11 API 调用? std::this_thread::exit(0) 之类的东西?

【问题讨论】:

  • 也许你应该寻找something like this(我知道不是便携式的)。
  • 为什么你希望你的线程在主线程退出后继续运行?你能等他们先完成吗?
  • @Dylon 老实说,我希望标准说这是不允许的。让我正在做的事情变得更简单。
  • 如果真正的问题是当您退出 main 时是否可以安全地销毁可能被正在运行的线程访问的东西,那么答案是否定的。在您加入该线程后,某些东西被破坏了。

标签: c++ multithreading c++11 pthreads


【解决方案1】:

2012-01-16 的Working Draft, Standard for Programming Language C++ 的第 1121 页似乎指出,一旦主线程退出,其分离的线程也将被清理(除非我误解了它):

void 分离();

要求:joinable() 为真。

效果: *this 表示的线程继续执行,不会阻塞调用线程。当 detach() 返回时,*this 不再代表可能继续执行的线程。当先前由 *this 表示的线程结束执行时,实现将释放所有拥有的资源。

后置条件:get_id() == id()。

当需要异常时抛出:system_error (30.2.2)。

错误情况:

— no_such_process — 如果线程无效。

— invalid_argument — 如果线程不可连接。

【讨论】:

  • 它们没有被“清理”,它们只是停止存在。如果他们访问从 main 返回的主线程和实际退出的进程之间的任何全局对象(例如,在全局析构函数运行时),您将面临未定义行为的风险。您引用的关于 “实现应释放任何拥有的资源” 的措辞是在谈论分离线程何时退出,但从main 返回并不会导致这种情况发生,分离线程仍在运行.
【解决方案2】:

从历史上看,main() 函数一直很特殊——它代表了应用程序的生命周期。 C++11 没有改变这一点。

main 函数返回时,程序清理并终止。这被硬编码到 C 运行时中。

任何会阻止main 正常重新调整的方法都会起作用(但没有可移植的方法来终止线程)。

您的情况下的解决方法可能只是永久阻塞主线程,或者重新使用它来进行一些监控/内务管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2013-08-28
    • 2012-08-06
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多