首页 > 解决方案 > 中断也是 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

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

编辑:在这个话题上,如果出现after异常,为什么不运行两次?

标签: haskellghc

解决方案


mask 有点防止引发异步中断。

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

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

默认情况下,POSIX 中断信号会AsyncException在主线程中引发。如果我理解正确,我认为这与您的问题无关。当人们说“可中断”时,他们并不是专门指 POSIX 中断信号。它们意味着如果一个动作没有被屏蔽,那么它是“可中断的” uninterruptibleMask,因此可以从任何来源接收任何异步异常。


推荐阅读