Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从线程强制退出程序_Haskell - Fatal编程技术网

Haskell 从线程强制退出程序

Haskell 从线程强制退出程序,haskell,Haskell,我使用error函数来传达一个巨大的程序员错误(有点像c断言),我希望程序立即失败并迫使我修复一个明显的错误(与标准运行时异常相反)。这已经很好地工作了很多年,但我目前正在开发一个多线程程序,现在它让我失望了 在线程中调用error不会退出程序。这是有据可查的。对于系统.Exit.die,控制.Exception.Base.assert等也存在此问题 我见过一些例子,它们通过在子线程和主线程之间构建重量级通信方法来绕过这个程序,但出于许多原因,这对于我来说很少实用: 我的线程通常是由库创建的,比

我使用
error
函数来传达一个巨大的程序员错误(有点像c断言),我希望程序立即失败并迫使我修复一个明显的错误(与标准运行时异常相反)。这已经很好地工作了很多年,但我目前正在开发一个多线程程序,现在它让我失望了

在线程中调用
error
不会退出程序。这是有据可查的。对于
系统.Exit.die
控制.Exception.Base.assert
等也存在此问题

我见过一些例子,它们通过在子线程和主线程之间构建重量级通信方法来绕过这个程序,但出于许多原因,这对于我来说很少实用:

  • 我的线程通常是由库创建的,比如源代码
  • 错误
    通常在库调用中抛出,例如在调用
    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..."
    

    如果您自己在执行
    fork
    ing,您可以捕获
    ErrorCall
    异常并将其重新发送到主线程。从文档中可以看出:“在一个独立的GHC程序中,只有主线程需要终止才能终止进程。”如果
    fork
    ing是由一些库函数(如
    mergeSources
    )完成的,那么情况就更复杂了——您无法控制在哪个线程中引发
    ErrorCall
    。你有一个示例程序吗?我相信在导管的情况下,您可以编写一个函数来封装异常处理程序中生成的每个值。