如何解决如何杀死Haskell中的线程
| 使用Control.Concurrent和forkIO,在某些情况下会使线程处于阻塞状态(这在带有网络的Windows中尤其常见),因此即使尝试使用killThread,也不会在线程中引发异常。 还有其他强制线程死亡的方法吗? 在这些情况下,我试图通过helper线程使用exitFailure终止整个应用程序没有任何效果。 我使用的是Glorious Glasgow Haskell编译系统,版本6.12.1 惠普2010.1.0.0 编辑:为了清理起见,我不想终止应用程序,我宁愿只是杀死已经被阻塞很长时间的线程。 但是,即使在SO上也有很多示例,它们在辅助线程中使用exitWith编写了完整的代码,并且这种方案在我所处的条件下不起作用。解决方法
为了进一步说明我在上面的评论,您不能中断阻止外来电话。但是,您可以使用非阻塞IO。对于Network程序包,这意味着字符串为“ 0”,字节字符串为“ 1”。我假设您也总是指定线程运行时?
, 要注意的另一件事是,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,
马丁
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。