使用Control.Concurrent和forkIO有一些情况会使线程处于阻塞状态(这在具有网络的Windows下尤为常见),因此即使尝试使用killThread,也不会在线程中引发异常。 有没有其他方法可以强制线程死?
我尝试使用exitFailure从帮助程序线程终止整个应用程序在这些条件下没有任何效果。
Glorious Glasgow Haskell编译系统,版本6.12.1 HP 2010.1.0.0
编辑:为了清理,我不想终止应用程序,我宁愿只杀掉已经被阻塞了很长时间的线程。 然而,即使在这里有很多例子,在辅助线程中使用exitWith的完整代码,并且这种方案在我所拥有的条件下不起作用。
答案 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 package。 Win32 package下可能存在类似的非Posix功能。
但是,最好设计您的应用程序,以便您的信令机制得到尊重,当然。
答案 3 :(得分:1)
您可以从应用中的任何线程调用ExitProcess()API,整个过程,线程和所有线程都将被终止。有一些问题与一些DLL分离可能会导致问题,并且一个进程无法终止,直到它的所有句柄都已释放,但ExitProcess()总是适合我作为最后的手段。
ExitProcess()不关心你的线程处于什么状态。可以在I / O上阻塞或者在与调用ExitProcess()的线程不同的处理器上运行 - 这没关系,操作系统会阻止它们全部
RGDS, 马丁