繁体   English   中英

Haskell 中的 STM 和 unsafePerformIO

[英]STM and unsafePerformIO in Haskell

STM 的文档指出:

在原子内部使用 unsafePerformIO 也很危险,但原因不同。 有关更多信息,请参阅 unsafeIOToSTM。

在使用线程和异步异常时,有一些函数可以屏蔽异步异常,以便可以安全地分配和释放资源。

但是有很多函数在后台使用unsafePerformIO ,例如memory package中的memory ,并且在 STM 事务中强制包含这样的表达式的 thunk 并不难。 这些函数在 STM 事务中使用真的安全吗? 是否存在可能导致 memory 泄漏或数据损坏的情况? 在这种情况下是否有等效的mask

谢谢

如果 IO 被 STM retry中断,通常安全使用unsafePerformIO可能会导致资源泄漏(不一定是 memory)或数据损坏。 这有两个原因:首先,STM 重试不运行异常处理程序,因此如果不安全的 IO 依赖异常处理程序释放资源(例如带bracket ),它们将不会被清理; 其次,IO 可能在任何时候被中断或多次执行,因此即使被中断,您也可以确保它保持程序不变量。

因此,例如allocAndFreeze不会泄漏,因为它在内部使用ForeignPtr ,在 GHC 中它只是将 memory 固定在托管堆中,因此它不依赖异常处理程序或终结器来回收 memory。 但是,它可能会导致数据损坏,如果不安全的 IO 暂时破坏数据结构中的不变量,例如“分配的数组必须始终排序”,那么如果计算在该点中断,这种破坏可能会变得可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM