如何杀死Haskell中的一个线程

使用Control.Concurrent和forkIO有一些情况会导致线程处于阻塞状态(这在networking连接的windows下尤其频繁),所以即使尝试使用killThread,也不会在线程中引发exception。 有没有其他的方式来强制线程死亡?

我试图用helper线程退出整个应用程序,在这些情况下没有任何效果。

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

编辑:要清除的东西了,我不想终止应用程序,我宁愿杀死已经被阻止了很长一段时间的线程。 然而,即使在这里,也有很多例子,在辅助线程中使用exitWith的完整代码,并且这种scheme在我所拥有的条件下不起作用。

Solutions Collecting From Web of "如何杀死Haskell中的一个线程"

为了扩大我上面的评论,你不能打断阻止外来电话。 但是,您可以使用非阻塞IO。 在Network包的情况下,这意味着recvLen为字符串, recvFrom为字节串。 我假设你总是指定线程运行时?

另外要注意的是GHC程序在主线程终止时终止。 子线的活泼性不重要。 如果你设计你的应用程序,以便始终可以通知主线程终止时间,那么阻塞任何子线程的方式并不重要。

在Posix环境中,您可以通过以下方式终止整个过程:

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

来自unix包 。 在Win32包下可能有类似的非Posix功能。

但是,最好设计一个应用程序,使得您的信号机制得到尊重。

您可以从应用程序中的任何线程调用ExitProcess()API,并且整个进程(线程和全部)将被终止。 有一些DLL可能会导致一个问题,一个进程无法终止,直到它的所有句柄已被释放,但ExitProcess()始终正常工作正常,作为最后的手段。

ExitProcess()不关心线程处于什么状态。可以在I / O上阻塞,或者在不同于调用ExitProcess()的线程上运行 – 不要紧,操作系统将全部阻止它们。

Rgds,Martin