我使用错误函数来传达一个巨大的程序员错误(有点像c断言),我希望程序立即失败并强迫我修复一个明显的错误(而不是标准的运行时异常).这已经运作了多年,但我目前正在研究一个多线程程序,它现在让我失望了.
在线程中调用错误不会退出程序.这是有据可查的,https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Concurrent.html.System.Exit.die,Control.Exception.Base.assert等也存在这个问题.
我已经看到通过在子线程和主线程之间构建重量级通信方法来绕过这个程序的例子,但由于很多原因,这对于我的目的来说很少实用:
>我的线程通常由库创建,例如管道mergeSources.
>错误通常在库调用中抛出,就像调用head []时一样.
>如果我需要通过线程间通信进行路由,那么很容易错过该机制.
有没有办法强制整个程序故意从一个线程崩溃?
最佳答案 以下示例适用于Windows;我导入并调用外部C函数退出:
{-# LANGUAGE ForeignFunctionInterface #-}
module Main where
import Control.Concurrent
foreign import ccall "exit" exit :: IO ()
main = do
forkIO exit
threadDelay 1000000
putStrLn "Main is still running..."