现在,这可能是一个非常新手的问题,但我并没有真正的多线程编程经验,而且我还没有完全理解线程与进程相比如何工作。
当我的机器上的进程挂起时,说它正在等待一些永远不会出现的IO或类似的IO,我可以杀死并重新启动它,因为其他进程不受影响,例如,仍然可以操作我的终端。当然,这是非常明显的。
我不确定进程中的线程是否相同:如果有人挂起,其他人是否不受影响?换句话说,我可以运行一个监视其他线程的“看门狗”线程,例如杀死并重新创建悬挂线程吗?例如,如果我有一个线程池,我不希望偶尔挂断。
答案 0 :(得分:4)
线程是独立的,但是进程和线程之间存在差异,那就是在进程的情况下,操作系统所做的不仅仅是“杀死”它。它也会在它之后清理。
如果您开始杀死似乎挂起的线程,很可能您会将资源锁定并保持类似状态,如果您对进程执行相同操作,操作系统会为您关闭。
因此,例如,如果您打开一个文件进行编写,并开始生成数据并将其写入文件,并且此线程现在挂起,无论出于何种原因,终止该线程将使文件仍处于打开状态,并且很可能已锁定,直到你关闭整个程序。
所以你问题的真正答案是:不,你不能用艰难的方式杀死线程。
如果您只是要求线程关闭,那就不同了,因为线程仍处于控制状态,可以在终止之前清理和关闭资源,但是调用像“KillThread”或类似的API函数是不好的。
答案 1 :(得分:1)
如果线程挂起,其他线程将继续执行。但是,如果挂起的线程已锁定信号量,临界区或其他类型的同步对象,而另一个线程尝试锁定同一个同步对象,则现在会出现死锁,其中有两个死线程。
可以监视线程中的其他线程。根据您的平台,有适用的API:我推荐您,因为您没有说明您正在编写的操作系统。
答案 2 :(得分:0)
你没有提到平台,但就我而言,NT内核调度线程,而不是以这种方式独立处理和威胁它们。在其他平台(某些平台,如Windows 3.1,不使用抢先式多线程,如果一个线程进入无限循环,一切都受到影响),这可能不是也不是真的。
答案 3 :(得分:0)
简单的答案是肯定的。
通常情况下,线程中的代码会处理这个可能的引擎本身。最常见的许多执行可能挂起操作的API将具有自己的超时功能。
或者,线程不仅会等待可能挂起的操作,还会等待计时器。如果计时器首先发出信号,则说明操作已经挂起。
因为看门狗线程在这种情况下有用,所以需要与其他线程中的代码进行一些合作,其中线程本身设置超时比看门狗更有意义。
答案 4 :(得分:0)
线程彼此独立安排。所以你确实可以停止并重新启动挂起的线程。线程不在单独的地址空间中运行,因此行为不当的线程仍然可以覆盖内存或者获取同一进程中其他线程所需的锁。
答案 5 :(得分:0)
对Java文档中杀死和挂起线程的一些缺陷进行了很好的概述,解释了为什么不推荐使用它的方法。基本上,如果你希望能够杀死一个线程,你必须非常非常小心地使它工作,没有某种腐败。如果一个线程被挂起,可能是因为一个bug ...在这种情况下杀死它可能会导致损坏。
http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
如果您需要能够杀死事物,请使用流程。