Mat*_*hid 33 multithreading haskell
我有一个使用多个线程的程序.据我了解,当线程0退出时,整个程序退出,无论其他线程可能仍在运行.
问题是,这些其他线程可能有文件打开.当然,这包含在异常处理代码中,以便在出现问题时干净地关闭文件.这也意味着如果我使用killThread
(通过实现throwTo
),该文件也应该在线程退出之前关闭.
我的问题是,如果我只是让线程0退出,而不试图阻止其他线程,那么各种文件句柄是否会被很好地关闭?是否刷新了任何缓冲输出?
简而言之,我可以退出,还是我需要先手动杀死线程?
通过我的测试,我发现了一些事情:
exitFailure
而朋友们只在线程 0 中工作。(文档实际上是这么说的,如果你不厌其烦地阅读它的话。这些函数只是抛出异常,而这些异常在其他线程中会被默默地忽略。)
如果异常终止了您的线程或整个程序,则不会刷新任何打开的句柄。当您拼命地试图找出程序崩溃的确切位置时,这是非常烦人的!
所以看起来如果你想在程序退出之前刷新你的东西,那么你必须实现这个。只是让线程 0 死亡不会刷新内容,不会引发任何异常,只是默默地终止所有线程而不运行异常处理程序。