“unsafePerformIO (newTVarIO 0)”有多安全?

发布于 2024-12-22 23:37:16 字数 295 浏览 1 评论 0原文

我在 中注意到了这个习惯用法Data.Unique

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

是否保证只运行一次?

I've noticed this idiom in Data.Unique:

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

Is it guaranteed to only run once?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

东京女 2024-12-29 23:37:16

在 GHC 中,是的。1 请参阅 文档了解更多信息;有一个变体 unsafeDupablePerformIO 可以多次执行,以避免专门用于实现此保证的开销。

请注意,创建可变变量的 unsafePerformIO 通常并不安全;如文档中所述,您可以创建多态引用并使用它来实现 unsafeCoerce。不过,这不是您可能会意外执行的操作,并且它不适用于相关代码(因为引用的类型是明确指定的)。

safe-globals 包抽象了这个“习惯用法”(虽然在某些情况下很有用,但它是通常被认为是反模式,并且不应该用于正常代码)以确保安全的方式。

另请参阅我的之前的答案< /a> unsafePerformIO 以及应用它时必须注意的事项。

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

In GHC, yes.1 See the documentation for more information; there is a variant unsafeDupablePerformIO that can be executed multiple times that avoids the overhead dedicated to achieving this guarantee.

Note that unsafePerformIO to create mutable variables isn't safe in general; as described in the documentation, you can create a polymorphic reference and use it to implement unsafeCoerce. That's not something you're likely to do accidentally, though, and it doesn't apply to the code in question (since the type of the reference is specified explicitly).

The safe-globals package abstracts this "idiom" (while useful in some cases, it's generally considered an antipattern, and should not be used in normal code) in a way that ensures safety.

See also my previous answer on unsafePerformIO and the caution that must be used when applying it.

1 I'm pretty sure it applies to all other implementations, too; the special care GHC takes to avoid repeated execution is only necessary in a threaded setting, and I don't know of any other threaded implementations of Haskell. GHC is the only implementation people really use these days, though...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文