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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断也是GHC中的异步异常吗?相关的知识,希望对你有一定的参考价值。

当试图理解GHC程序如何在信号和异常方面发挥作用时,我发现了一个有关"fixing" the bracket的有趣且无定论的讨论。

我很难理解当一个支架已经masks asynchronous exceptions时为什么需要改变。

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

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

根据我的理解,必须对after a进行评估以提供IO行动,该行动将由IO monad强制执行,该行动位于mask范围内。

编辑:关于这个话题,为什么after在例外情况下不会运行两次?

答案

mask有助于防止引发异步中断。

如果被屏蔽的线程以某种方式阻塞,则在屏蔽状态下仍然可以接收异步异常

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

默认情况下,POSIX中断信号会导致主线程中出现AsyncException。如果我理解正确,我认为这与你的问题无关。当人们说“可中断”时,他们并不是指具体的POSIX中断信号;它们意味着如果一个动作没有被uninterruptibleMask掩盖,那么它就是“可中断的”,因此可以从任何来源接收任何异步异常。

以上是关于中断也是GHC中的异步异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

异常和TCP通讯

GADT 可以用来证明 GHC 中的类型不等式吗?

当异步方法中的一个发生异常时终止所有线程

我可以告诉 GHC 随意选择使用哪个实例,因为我不在乎吗?

初探Promise 中断与异常传送

初探Promise 中断与异常传送