gpt4 book ai didi

haskell - Haskell 中的 STM 和 unsafePerformIO

转载 作者:行者123 更新时间:2023-12-02 02:42:29 26 4
gpt4 key购买 nike

documentation for STM指出:

Using unsafePerformIO inside of atomically is also dangerous but for different reasons. See unsafeIOToSTM for more on this.



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

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

谢谢

最佳答案

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

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

关于haskell - Haskell 中的 STM 和 unsafePerformIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62265750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com