STM文档中指出:
在atomically中使用unsafePerformIO也是危险的,但原因不同。请参阅unsafeIOToSTM了解更多信息。
当涉及到使用线程和异步异常时,有一些函数用于屏蔽异步异常,以便可以安全地分配和释放资源。
但是有许多函数在幕后使用unsafePerformIO
,例如memory
包中的allocAndFreeze函数,而且很容易强制执行包含此类表达式的thunk在STM事务内部。这些函数在STM事务内部实际上是安全的吗?是否存在导致内存泄漏或数据损坏的情况?是否有与此情况等价的mask
函数?
谢谢
atomically setup; foreignCall; atomically teardown
,其中setup
和teardown
获取并释放某种锁(例如TVar Bool
);或者您可以在单独的线程中执行它,因此即使事务重试,调用也将正常完成,类似于uninterruptibleUnsafeIOToSTM io = unsafeIOToSTM (do { m <- newEmptyMVar; forkIO ((putMVar m . Right =<< io) `catch` \ (e :: SomeException) -> putMVar m (Left e)); either throw pure =<< takeMVar m })
。 - Jon PurdyunsafePerformIO
,即使你使用类似于bracket的东西来覆盖异步异常,你的计算仍然可能会在STM中被中断,这一点并不明显。在某些情况下,uninterruptableUnsafeIOToSTM
将是一个很好的解决方法。谢谢! - Scott