- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
语境:
我试图了解 cancel
之间的区别和 uninterruptibleCancel
来自 Control.Concurent.Async
包裹。我相信这与 mask
的基本概念有关。 , uninterruptibleMask
, 和 interruptible operations .这就是我所理解的:
throwTo
做。在某种程度上,这也可以被认为是一种线程间通信的形式。 try
/catch
围绕某些操作,只期望/处理某些异常。但是,当目标线程可能在执行中的任何点时,可以传递异步异常。 mask
允许用于保护目标/接收线程中的关键部分免受异步异常的传递。受 mask
保护的操作在调用 restore
之前不需要处理异步异常. uninterruptibleMask
进入画面,我开始失去情节。我认为
mask
的全部要点是在执行一段 protected 代码时不传递异步异常。但是,以下是文档关于“可中断操作”的说法:
It is useful to think of mask not as a way to completely prevent asynchronous exceptions, but as a way to switch from asynchronous mode to polling mode. The main difficulty with asynchronous exceptions is that they normally can occur anywhere, but within a mask an asynchronous exception is only raised by operations that are interruptible (or call other interruptible operations). In many cases these operations may themselves raise exceptions, such as I/O errors, so the caller will usually be prepared to handle exceptions arising from the operation anyway. To perform an explicit poll for asynchronous exceptions inside mask, use allowInterrupt.
mask
保护的代码块内, 如果有一些地方可以安全地处理异步异常,可以调用 allowInterrupt
.这隐含的意思是,除非 allowInterrupt
被调用,执行时不会传递异步异常 mask
编代码。那么,uninterruptibleMask
的目的是什么? ? uninterruptibleCancel
的需求是什么? ? IIUC,线程 A 试图取消线程 B,但线程 A 本身试图保护自己免受某种异步异常的影响,这可能是由第三个线程 C 发起的,对吗?在 cancel
的代码中(如下所示),哪个部分如此重要以至于需要对异步异常进行最终形式的保护?不是throwTo
原子/屏蔽操作本身?此外,即使在执行 waitCatch
时将异步异常传递给线程 A ,有什么区别?实际上,如果我想一想,为什么我们甚至需要 mask
首先是这段代码(更不用说uninterruptibleMask
)? cancel a@(Async t _) = throwTo t AsyncCancelled <* waitCatch a
最佳答案
在没有屏蔽的情况下,异步异常可以在任何地方发生。在 mask
下,异步异常只能出现在可中断的 Action (通常是阻塞的)中。在 uninterruptibleMask
下,异步异常完全不存在。另外,请注意 allowInterrupt
只是可中断的 Action 之一;还有很多,例如takeMVar
.只需 mask
, 例如无法阻止 MVar
不向异常(exception)敞开心扉,而是uninterruptibleMask
让你这样做(尽管你不应该这样做)。uninterruptibleCancel
很有用,因为 cancel
等待目标线程完成。这是一个阻塞操作,所以按照惯例,它也是可中断的。因此,当您使用 cancel
,无论你是 mask
,你都会接受意外的异常。编辑与否。当您使用 uninterruptibleCancel
,您可以 100% 保证不会出现异常。就是这样。请记住,异常是非本地的;即使 cancel
中没有任何内容很关键,让它不 protected 意味着异常可能会泄漏到原来的东西中。
mask $ do
cancel something -- whoops, this can receive an exception, even though it's masked
someCleanup -- therefore this might not get called
mask $ do
uninterruptibleCancel something -- no exceptions
someCleanup -- so this will definitely happen (assuming the target thread ends)
关于multithreading - cancel 和 uninterruptibleCancel 之间的区别(来自 Async 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58360596/
语境: 我试图了解 cancel 之间的区别和 uninterruptibleCancel 来自 Control.Concurent.Async包裹。我相信这与 mask 的基本概念有关。 , uni
我是一名优秀的程序员,十分优秀!