优雅地结束一个线程的必要性

时间:2015-06-29 07:57:18

标签: multithreading kill-process

如果我正在构建一个多线程应用程序,当我中止应用程序时,它的所有线程都会自动被杀死。

如果我希望一个线程的生命周期等于主线程的生命周期,我真的需要优雅地结束线程,还是让应用程序中止处理它?

编辑:由于线程规则取决于操作系统,我也希望听到以下意见:

  1. 的Android
  2. 的Linux
  3. 的iOS

2 个答案:

答案 0 :(得分:2)

这取决于线程在做什么。

当线程被杀死时,它的执行会在代码中的任何一点停止,这意味着某些操作可能无法完成,例如

  • 撰写文件
  • 发送网络消息

操作系统将

  • 关闭应用程序拥有的所有句柄
  • 释放任何锁
  • 释放所有记忆
  • 关闭所有打开的文件
  • 等...

因此,只要您确保所有文件等处于一致状态,您就不必担心系统资源。

我知道this is true for Windows,如果在其他操作系统上有所不同,我会感到非常惊讶。到目前为止,没有释放所有资源的应用程序可能会影响整个系统的时间早已不复存在。

答案 1 :(得分:1)

没有。对于大多数非平凡的操作系统,您不需要显式/优雅地终止应用程序生命周期线程,除非有特定的和压倒一切的需要。

只有一个原因是你不能总是用用户代码实际做到这一点。用户级代码无法停止在请求停止的线程之外的另一个核心上运行的线程。操作系统可以,也可以。

你的linux / Windows操作系统非常适合在核心上的任何状态下停止线程并在进程终止时释放线程堆栈,堆栈,操作系统对象句柄/ fd等资源。它在全球范围内对系统进行了数百万小时的测试,这是您自己的用户代码不太可能经历过的。如果你能这样做,你应该让操作系统做他们擅长的事情。

在其他帖子中,已经提出了几个案例,其中线程的用户级终止可能是不可避免的。进程间通信是一个区域,数据库连接/事务也是如此。如果按照你的要求被迫进入它,那么很好,去吧,否则,不要尝试 - 这是浪费时间和精力编写/测试/调试线程停止代码来做什么操作系统可以独立完成。

谨防过早的停止。