繁体   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