gpt4 book ai didi

haskell - `unsafePerformIO (newTVarIO 0)` 有多安全?

转载 作者:行者123 更新时间:2023-12-04 02:08:16 25 4
gpt4 key购买 nike

我在 Data.Unique 中注意到了这个成语:

uniqSource :: TVar Integer
uniqSource = unsafePerformIO (newTVarIO 0)
{-# NOINLINE uniqSource #-}

是否保证只运行一次?

最佳答案

在 GHC 中,是的。1 见 the documentation了解更多信息;有一个变种 unsafeDupablePerformIO可以多次执行,从而避免了专用于实现此保证的开销。

请注意 unsafePerformIO创建可变变量通常是不安全的;如文档中所述,您可以创建多态引用并使用它来实现 unsafeCoerce .不过,这不是您可能会意外做的事情,而且它不适用于有问题的代码(因为明确指定了引用的类型)。

safe-globals包以确保安全的方式抽象了这个“成语”(虽然在某些情况下很有用,但它是 generally considered an antipattern,不应该在普通代码中使用)。

另见我的previous answerunsafePerformIO以及应用时必须注意的事项。

1 我很确定它也适用于所有其他实现; GHC 为避免重复执行而采取的特殊措施仅在线程设置中是必要的,而且我不知道 Haskell 的任何其他线程实现。 GHC 是当今人们真正使用的唯一实现,尽管......

关于haskell - `unsafePerformIO (newTVarIO 0)` 有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631176/

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