如何终止 C 11 中的线程?

新手上路,请多包涵

我不需要正确终止线程,或者让它响应“终止”命令。我有兴趣使用纯 C++11 强制终止线程。

原文由 Alexander V 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答
  1. 您可以从任何线程调用 std::terminate() 并且您所指的线程将强制结束。

  2. 您可以安排 ~thread() 在目标线程的对象上执行,而无需干预 join()detach() 在该对象上。这将具有与选项 1 相同的效果。

  3. 你可以设计一个异常,它有一个抛出异常的析构函数。然后安排目标线程在被强制终止时抛出这个异常。这个棘手的部分是让目标线程抛出这个异常。

选项 1 和 2 不会泄漏进程内资源,但它们会终止 每个 线程。

选项 3 可能会泄漏资源,但部分合作是因为目标线程必须同意抛出异常。

C++11(我知道)中没有可移植的方式来非合作地杀死多线程程序中的单个线程(即不杀死所有线程)。没有设计这样一个功能的动机。

一个 std::thread 可能有这个成员函数:

 native_handle_type native_handle();

您也许可以使用它来调用依赖于操作系统的函数来执行您想要的操作。例如,在 Apple 的操作系统上,此函数存在并且 native_handle_typepthread_t 。如果你成功了,你很可能会泄漏资源。

原文由 Howard Hinnant 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想需要被杀死的线程要么处于任何等待模式,要么正在做一些繁重的工作。我建议使用“幼稚”的方式。

定义一些全局布尔值:

 std::atomic_bool stop_thread_1 = false;

将以下代码(或类似代码)放在几个关键点中,这样会导致调用堆栈中的所有函数返回,直到线程自然结束:

 if (stop_thread_1)
    return;

然后从另一个(主)线程停止线程:

 stop_thread_1 = true;
thread1.join ();
stop_thread_1 = false; //(for next time. this can be when starting the thread instead)

原文由 Doron Ben-Ari 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题