当试图了解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
为何在出现异常的情况下不会运行两次?
答案 0 :(得分:5)
mask
一种可防止引发异步中断。
如果被屏蔽的线程以某些方式阻塞,则在处于被屏蔽状态时,异步异常仍可能被接收
有一个不同的功能uninterruptibleMask
,它完全阻止了异步异常。
默认情况下,POSIX中断信号的确会在主线程中引发AsyncException
。如果我正确理解,我认为这与您的问题无关。当人们说“可中断”时,他们并不是专门指POSIX中断信号。它们表示如果未用uninterruptibleMask
屏蔽操作,则该操作是“可中断的”,因此可以从任何来源接收任何异步异常。