线程什么时候死?

When does a thread die?

作为CS的学生,我学习了几乎所有课本上的概念。

我知道线程死掉时可能会出现不好的情况。

但我想知道什么时候线程会意外死掉。

什么时候可以在现实世界中发生?

让我听听你的真实经历。

** 当我读到当线程因持有锁而意外死亡时可能会发生坏事时,我想到了这个问题。

一个线程在没有事情可做时应该死掉。在我见过的每个线程框架中,您通过提供一个函数来告诉线程要做什么,框架将在线程内一次调用该函数。

当该函数 returns(通过正常 return 或通过抛出未捕获的异常)时,它告诉框架线程没有什么可做的,因此框架杀死线程。

在某些框架中,特别是在语言没有任何非本地退出机制(即异常)的情况下,框架还会提供一个函数,线程可以调用该函数来显式终止自身。


I want to know when a thread can die accidentally

从库开发人员或 OS 开发人员的角度来看,这不可能发生。如果一个线程可能会死掉 "by accident," 那么这将是库 and/or OS.

中的一个严重缺陷

您的代码 可能会不小心做一些您不希望它做的事情。那也是一个缺陷,但是这个缺陷是你自己去发现和修复的。

  • 如果您的缺陷导致未捕获的异常,那么框架可能只会杀死一个线程,或者它可能会杀死整个进程。它无能为力:您不能指望库作者知道如何处理任意程序中的任意异常并从中恢复。
  • 如果您的缺陷导致硬件故障(例如,尝试读取或写入无效的内存地址),则情况大致相同。 OS 可能会通过在您的线程中引发异常来响应(在这种情况下,请参见上文),或者它可能会直接跳到终止线程或整个进程的部分。
  • 如果您的缺陷导致其他一些行为(例如,死锁、无限循环等),那么线程可能不会死,直到您通过向进程发送信号等进行干预