簡體   English   中英

弱引用終結器保證運行

[英]Weak Reference Finalizer Guaranteed to Run

Edward Yang 在《 GHC中的弱指針和終結器的代價》中寫道(強調):

弱指針還可以選擇與終結器關聯,終結器在對象被垃圾回收時運行。 Haskell終結器無法保證運行。

我找不到任何證實這一說法的文件。 System.Mem.Weak中的文檔對此並不明確。 我需要知道的是,給定一些具有標識的原語( MutVar#MutableArray#Array#等),如果我將終結器附加到該終結器,則在值被GCed時會可靠地調用它嗎?

原因是我正在考慮做這樣的事情:

data OffHeapTree = OffHeapTree
  { ref :: IORef ()
  , nodeCount :: Int
  , nodeArray :: Ptr Node
  }

data Node = Node
  { childrenArray :: Ptr Node
  , childrenCount :: Int
  , value :: Int
  }

我想確保在OffHeapTree超出范圍時釋放數組(以及數組指向的所有內容)。 否則,它將泄漏內存。 那么,是否可以使用mkWeakIORef可靠地完成此操作?

“不能保證運行Haskell終結器”意味着可能不會執行GC(例如,在程序退出時)。 但是,如果執行了GC,則將執行終結器。

編輯:對於將來的讀者:上面的說法並不完全正確。 RTS在GC之后產生一個單獨的線程來執行終結器。 因此,在執行GC之后,程序可能會退出,但尚未執行終結器,請參見此注釋

無論如何理論上都是如此。 實際上,終結器可能不會執行 ,例如,當RTS嘗試連續執行多個終結器,然后其中一個拋出異常時。 因此,除非不可避免,否則我不會使用終結器。

暫無
暫無

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

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