从线程强制退出程序

时间:2016-03-10 18:19:12

标签: haskell

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

在线程中调用error不会退出程序。这是有据可查的,https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Concurrent.htmlSystem.Exit.dieControl.Exception.Base.assert

也存在此问题

我已经看到通过在子线程和主线程之间构建重量级通信方法来绕过这个程序的例子,但由于很多原因,这对我的目的来说很少实用:

  1. 我的线程通常由库创建,例如渠道mergeSources。
  2. error经常被引入库调用,就像您致电head []时一样。
  3. 如果我需要通过线程间通信进行路由,那么很容易错过这种机制。
  4. 有没有办法强制整个程序故意从一个线程崩溃?

1 个答案:

答案 0 :(得分:2)

以下示例适用于Windows;我导入并调用外部C函数exit

{-# 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..."