GHC中的中断也是异步异常吗?

时间:2019-04-08 19:52:17

标签: haskell ghc

当试图了解GHC程序在信号和异常方面的工作原理时,我发现了关于"fixing" the bracket的有趣但不确定的讨论。

我很难理解为什么在已经masks asynchronous exceptions的括号中需要进行更改。

在我看来,中断(例如在POSIX信号中)不是异步异常,或者我在当前长期存在的实现中缺少一些细节:

bracket before after thing =
  mask $ \restore -> do
    a <- before
    r <- restore (thing a) `onException` after a
    _ <- after a -- can be interrupted??
    return r

据我所知,必须对after a进行评估,以提供IO monad将在IO范围内强制执行的mask操作。

编辑:在主题上,after为何在出现异常的情况下不会运行两次?

1 个答案:

答案 0 :(得分:5)

mask 一种可防止引发异步中断。

  如果被屏蔽的线程以某些方式阻塞,则在处于被屏蔽状态时,

异步异常仍可能被接收

有一个不同的功能uninterruptibleMask,它完全阻止了异步异常。

默认情况下,POSIX中断信号的确会在主线程中引发AsyncException。如果我正确理解,我认为这与您的问题无关。当人们说“可中断”时,他们并不是专门指POSIX中断信号。它们表示如果未用uninterruptibleMask屏蔽操作,则该操作是“可中断的”,因此可以从任何来源接收任何异步异常。