Boehm GC如何实现弱引用?

时间:2019-05-01 13:35:16

标签: c boehm-gc

我有一个使用Boehm GC实施的个人项目。我需要实现一种事件类型,该事件类型应包含对其他事件的引用。但是我还需要确保指向的事件仍然可以收集,因此我需要为此提供较弱的引用。

比方说,我们有事件A,B和C。我将这些事件配置为在发出信号X时发出信号X。这意味着A,B和C必须持有对事件X的引用。我想要的是,如果事件X无法访问,则事件A,B和C不再需要发出信号了。因此,我想到的只是一个薄弱的参考。

还有其他方法吗?我不想更改GC,但如有必要(分配接口保持干净),我可以更改。

该项目用C编写。如有需要,我将提供更多信息。值得注意的是,如果有任何一种方法可以直接使用这种语义直接实现此类事件,则不需要实际的弱引用(事件可以有一个引用周期,尽管它们没有发出信号)。

1 个答案:

答案 0 :(得分:3)

Boehm GC本身并没有弱引用的概念。但是,它不会扫描系统malloc分配的内存以引用对被管理对象,因此存储在此类内存中的指针不会阻止收集指向的对象。当然,这种方法意味着包含指针的对象将不会由收集器管理。

或者,应该有可能滥用GC_MALLOC_ATOMIC()GC_malloc_explicitly_typed()来获取一个托管对象,该对象可以包含指向其他托管对象的指针,而又不会阻止收集这些其他对象。基本上,这涉及向GC投诉某些成员是否为指针,以防止对其进行扫描。

无论哪种方式,您都需要某种机制来在收集弱引用的对象时接收通知,从而避免以后尝试访问它们。 GC具有一个用于注册finalizer回调的接口,该回调在收集对象之前被调用,这看起来是您为此目的最好的选择。

总的来说,我认为您所要求的是可行的,但是涉及很多DIY。

  • 使用GC_MALLOC_ATOMIC()在指向弱引用对象的指针周围分配包装对象。通过这种方式分配,可以使包装程序本身由GC管理,而在GC的可达性分析过程中不会扫描内部的指针。
  • 使用GC_register_finalizer注册一个终结器函数,当GC判定指向的对象不可访问时,该终结器函数将包装器的指针设置为NULL
  • 包装器的用户有义务在尝试取消对其的引用之前检查其中的指针是否为NULL