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
据我了解,after a
必须进行评估以提供在范围内IO
由IO
monad强制执行的操作mask
。
编辑:在这个话题上,如果出现after
异常,为什么不运行两次?
解决方案
mask
有点防止引发异步中断。
如果被屏蔽的线程以某些方式阻塞,则在处于屏蔽状态时仍可能接收到异步异常
有一个不同的函数,uninterruptibleMask
它可以完全阻止异步异常。
默认情况下,POSIX 中断信号会AsyncException
在主线程中引发。如果我理解正确,我认为这与您的问题无关。当人们说“可中断”时,他们并不是专门指 POSIX 中断信号。它们意味着如果一个动作没有被屏蔽,那么它是“可中断的” uninterruptibleMask
,因此可以从任何来源接收任何异步异常。
推荐阅读
- python - 通过 Kivy 的 buildozer 进入 APK 的 ModuleNotFoundError?
- java - 无法在 Java 中捕获异常
- javascript - 为什么每次调用“show()”时我的 JqGrid 都会缩小?
- python - 在 python 的 SocketIO.Client() 模块中为客户端显式分配端口号
- javascript - 检测外部表格行点击
- python - 为 Flask 应用创建系统服务时如何解决(code=exited,status=203/Exec)
- javascript - 如何使用 querySelector 从 SVG 中选择看起来像 id 的名称?
- amazon-cloudfront - AWS Cloudfront:什么是 AWS 管理的 EDGE Cloudfront 分配的缓存策略
- c# - 无法使用 Selenium Webdriver for C# 选择 ul 中的最后一个 li 元素
- html - 以粗体显示引导工具提示字的样式