代码之家  ›  专栏  ›  技术社区  ›  James McMahon

同一进程中的线程有多独立?

  •  3
  • James McMahon  · 技术社区  · 16 年前

    现在,这可能是一个很新的问题,但是我没有多线程编程的经验,而且我还没有完全理解线程与进程相比是如何工作的。

    当我机器上的一个进程挂起时,比如说它正在等待一些永远不会出现的IO或类似的东西,我可以终止并重新启动它,因为其他进程不受影响,例如,仍然可以操作我的终端。当然,这是非常明显的。

    我不确定进程内的线程是否相同:如果一个挂起,其他线程是否不受影响?换句话说,我可以运行一个“看门狗”线程来管理其他线程,例如,杀死并重新创建挂起的线程吗?例如,如果我有一个线程工具,我不想被偶尔的宿醉排干。

    6 回复  |  直到 16 年前
        1
  •  4
  •   Lasse V. Karlsen    16 年前

    线程是独立的,但进程和线程之间有区别,也就是说,在进程的情况下,操作系统不仅仅是“杀死”它。之后它也会被清理干净。

    如果您开始杀死似乎挂起的线程,很可能会使资源保持锁定和类似状态,如果您对进程执行相同操作,操作系统将为您关闭这些线程。

    例如,如果您打开一个文件进行写入,并开始生成数据并将其写入文件,那么这个线程现在挂起,无论出于什么原因,终止线程都会使文件保持打开状态,并且很可能被锁定,直到您关闭整个程序。

    所以你的问题的真正答案是:不,你不能用硬的方式杀死线程。

    如果您只是要求一个线程关闭,这是不同的,因为线程仍然在控制中,可以在终止之前清理和关闭资源,但是调用类似于killthread的API函数是不好的。

        2
  •  1
  •   John Källén    16 年前

    如果一个线程挂起,其他线程将继续执行。但是,如果挂起的线程锁定了一个信号量、关键部分或其他类型的同步对象,而另一个线程试图锁定同一个同步对象,那么现在就有了一个死锁,其中有两个死线程。

    可以从一个线程监视其他线程。取决于您的平台,这里有可应用的API:我指的是那些您还没有说明您要为什么操作系统编写的API。

        3
  •  0
  •   Mehrdad Afshari    16 年前

    您没有提到这个平台,但就我而言,NT内核调度线程,而不是以这种方式独立地处理和威胁线程。这在其他平台上可能不是也可能不是这样(有些平台,如Windows3.1,不使用抢占式多线程,如果一个线程进入无限循环,则会影响所有内容)。

        4
  •  0
  •   AnthonyWJones    16 年前

    简单的答案是“是”。

    通常,虽然线程中的代码会处理这个可能的hood本身。大多数执行可能挂起的操作的API都有自己的超时特性。

    或者,线程不仅要等待可能挂起的操作,还要等待计时器。如果计时器先发出信号,说明操作已挂起。

    因为对于在这个场景中有用的看门狗线程来说,需要其他线程中的代码进行一些合作,让线程本身设置超时比看门狗更有意义。

        5
  •  0
  •   Mendelt    16 年前

    线程的调度相互独立。所以您确实可以停止并重新启动挂起的线程。线程不会在单独的地址空间中运行,因此行为不正常的线程仍然可以覆盖内存或获取同一进程中其他线程所需的锁。

        6
  •  0
  •   Erik Engbrecht    16 年前

    对Java文档中的杀死和挂起线程的一些缺陷做了一个很好的概述,解释了为什么要执行它的方法被弃用。基本上,如果你希望能够杀死一根线,你必须非常非常非常小心地使它在没有某种腐败的情况下工作。如果一个线程挂起,可能是因为一个bug……在这种情况下,杀死它可能会导致损坏。

    http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

    如果您需要能够杀死东西,请使用过程。