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

sev*_*evo 2 haskell ghc

当试图了解GHC程序在信号和异常方面如何工作时,我发现了一个关于“固定”支架的有趣而无定论的讨论。

我很难理解为什么当括号已经掩盖了异步异常时为什么需要进行更改。

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

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

以我的理解,after a必须对其进行评估以提供在范围内IOIOmonad 强制执行的操作mask

编辑:在主题上时,为什么after在异常情况下不运行两次?

Chr*_*tin 5

mask 排序的防止异步中断被提出。

如果被屏蔽的线程以某些方式阻塞,则处于被屏蔽状态时仍可能接收到异步异常

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

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