簡體   English   中英

`unsafePerformIO(newTVarIO 0)的安全性如何?

[英]How safe is `unsafePerformIO (newTVarIO 0)`?

我在Data.Unique中注意到了這個習語:

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

保證只運行一次嗎?

在GHC,是的。 1有關詳細信息,請參閱文檔 ; 有一個變量unsafeDupablePerformIO可以多次執行,避免了專門用於實現此保證的開銷。

請注意, unsafePerformIO創建可變變量通常是不安全的; 如文檔中所述,您可以創建多態引用並使用它來實現unsafeCoerce 但是,這不是你可能偶然發生的事情,並且它不適用於有問題的代碼(因為引用的類型是明確指定的)。

safe-globals軟件包以一種確保安全的方式抽象出這個“成語”(雖然在某些情況下很有用,但它通常被認為是反模式 ,不應該用於普通代碼)。

另請參閱我之前關於unsafePerformIO 回答以及應用它時必須使用的注意事項。

1我很確定它也適用於所有其他實現; GHC需要特別注意以避免重復執行只在線程設置中,並且我不知道Haskell的任何其他線程實現。 GHC是人們現在真正使用的唯一實現,但......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM