【问题标题】:How do garbage collectors stop all threads efficiently?垃圾收集器如何有效地停止所有线程?
【发布时间】:2016-12-23 09:44:36
【问题描述】:

我目前正在实现一个简单语言的编译器,作为 C++ 中的一个副项目。我想添加一个垃圾收集器。大多数(全部?)垃圾收集算法都涉及在某个时候停止世界。

我很想知道是否有一种有效的方法可以暂时暂停父线程中的一组线程。我看到的唯一其他选项是定期检查 GC 是否要在每个函数和循环的顶部运行。这让我觉得效率低下,因为我每次都必须锁定和解锁,增加了相当大的开销。有没有更有效的方法来做到这一点?

【问题讨论】:

  • 它已经向前发展了,背景收藏是当今的标准功能。它是一个轮子,没有人喜欢方形的,所以不要重新发明一个。
  • 为什么要使用垃圾回收?将标准内存分配与在最后一个引用被清除时释放自己的引用计数对象一起使用会更快、更有效。例如,请参阅std::shared_ptr
  • @Remy 引用计数几乎是 可以想象的最糟糕的 GC 实现。如果您接受涉及循环的内存泄漏,那么它在延迟方面的唯一优势是。
  • HotSpot(以及据我所知的 CLR)中的标准实现实际上非常简单高效:让线程访问页面。如果你想放弃这个世界,使页面不可读,并在处理程序中处理访问冲突的所有内容。成本是每几千条指令进行一次可缓存读取,这几乎是免费的。
  • @Remy - 我确实考虑过引用计数,但出于增加经验和 Voo 提到的原因,我决定反对它。

标签: c++ multithreading garbage-collection


【解决方案1】:

没有很好的解决方法 - 你不能指望 C++ 标准库神奇地了解你的 VM 可以在哪里暂停。这个逻辑是你必须写的。

现在您当然可以按照您所描述的那样实现规则,或者您可以使用少于 N 条指令的叶函数例外,并且只检查每个第 M 次循环迭代等。实际上,没有限制您可以投入其中的大脑数量。

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 2010-09-21
    • 2011-10-15
    • 2023-03-21
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多