如何在Haskell中杀死一个线程

时间:2011-05-31 08:58:02

标签: windows multithreading haskell signals ghc

使用Control.Concurrent和forkIO有一些情况会使线程处于阻塞状态(这在具有网络的Windows下尤为常见),因此即使尝试使用killThread,也不会在线程中引发异常。  有没有其他方法可以强制线程死?

我尝试使用exitFailure从帮助程序线程终止整个应用程序在这些条件下没有任何效果。

Glorious Glasgow Haskell编译系统,版本6.12.1 HP 2010.1.0.0

编辑:为了清理,我不想终止应用程序,我宁愿只杀掉已经被阻塞了很长时间的线程。 然而,即使在这里有很多例子,在辅助线程中使用exitWith的完整代码,并且这种方案在我所拥有的条件下不起作用。

4 个答案:

答案 0 :(得分:3)

另外需要注意的是GHC程序在主线程终止时终止。子线程的活跃性并不重要。如果你设计你的应用程序,以便你总能在主线程上发出终止时间的信号,那么任何子线程的阻塞程度都无关紧要。

答案 1 :(得分:3)

要扩展我上面的评论,您不能中断阻止外来电话。但是,您可以使用非阻塞IO。对于网络包,这意味着recvLen表示字符串,recvFrom表示字节串。我假设你总是指定线程运行时?

答案 2 :(得分:2)

在Posix环境中,您可以使用以下命令终止整个过程:

-- | @'exitImmediately' status@ calls @_exit@ to terminate the process
--   with the indicated exit @status@.
--   The operation never returns.
exitImmediately :: ExitCode -> IO ()

来自the unix packageWin32 package下可能存在类似的非Posix功能。

但是,最好设计您的应用程序,以便您的信令机制得到尊重,当然。

答案 3 :(得分:1)

您可以从应用中的任何线程调用ExitProcess()API,整个过程,线程和所有线程都将被终止。有一些问题与一些DLL分离可能会导致问题,并且一个进程无法终止,直到它的所有句柄都已释放,但ExitProcess()总是适合我作为最后的手段。

ExitProcess()不关心你的线程处于什么状态。可以在I / O上阻塞或者在与调用ExitProcess()的线程不同的处理器上运行 - 这没关系,操作系统会阻止它们全部

RGDS, 马丁