【问题标题】:What is the best way to kill a running thread after x secconds?x秒后杀死正在运行的线程的最佳方法是什么?
【发布时间】:2026-01-01 12:00:01
【问题描述】:

我正在开发一个 c++ 项目,该项目加载共享对象并在单独的线程中对其运行方法。如果这些线程尚未终止,系统要求在 x 秒后关闭所有这些线程。我能够跟踪哪些线程已关闭,但是杀死尚未完成的线程的最佳方法是什么?

旁注- Pthread_cancel 导致分段错误。

【问题讨论】:

  • 线程本身可以触发一个杀死它们的警报吗?或者外部线程/进程是否必须这样做?
  • 您是否有示例代码,例如出现此分段错误的位置?
  • 任何一个都可以做到。我现在正试图发出警报。我知道警报正在被触发,但是当我调用 pthread_exit(NULL) 时。什么都没有发生。
  • 什么平台?视窗?苹果电脑? Unix?
  • Unix 系统。主要是 x_86 和 armv7 运行 monivista

标签: c++ multithreading segmentation-fault


【解决方案1】:

这是不可能的。您不能在没有线程合作的情况下取消线程而不冒破坏进程上下文的风险。

线程不提供那种隔离。他们只是没有。如果线程失败,则进程失败。您需要在其自己的进程、虚拟机等中包含不受信任或不可靠的代码。螺纹是完全可渗透的。

线程做的最常见的事情之一是:

  1. 获取锁。

  2. 打破一些不变量(受锁保护)。

  3. 恢复那些不变量。

  4. 释放锁。

现在想象一下,如果线程已经完成了第 2 步但没有完成第 3 步。您无法释放锁(因为这会导致下一个获取锁的线程遇到损坏的不变量)并且您无法离开锁持有(因为这将导致下一个线程尝试获取锁以永远等待)。所以此时进程上下文将被销毁。

你需要线程的配合才能让它恢复不变量。

【讨论】:

  • 在 c++ 中 WaitForSingleObject 不会成功吗?只是好奇。
  • @Maddy 这不会取消任何东西,它只是等待。
  • @nbroeking,不冒破坏进程上下文的风险
  • pthread_kill 只是向线程发送一个信号。如果线程忽略它,则不会发生任何事情。如果你发送一个不可忽视的 KILL 信号,它会杀死整个进程。 pthread_exit只能被退出的线程调用(退出当前线程)。
  • @nbroeking 通过“破坏进程上下文”,我们的意思是在不冒不可预测和不可靠操作的风险的情况下使进程无法继续。 (查看更新。)
【解决方案2】:

我建议与此处建议的内容类似:

Run and break an infinite loop using two threads

简而言之,设置一个退出条件,您的线程需要每隔一段时间检查一次。如果设置,他们应该返回。如果所有线程都应该一起死掉,你只需要一个原子。

【讨论】:

  • 线程由共享对象加载,因此应用程序无法强制执行此操作。