【发布时间】:2021-07-30 02:46:16
【问题描述】:
许多带有跟踪垃圾收集器的编程语言原生 C API 都有一个 root 和 unroot 函数来保护临时值不被收集。
在多线程环境中,如果本机函数取消其所有对象的根,然后返回其中一个对象,如果在取消根和返回之间,另一个线程分配导致集合,会发生什么情况?我尝试返回的值是否也会被收集?
我查看了 Ruby、Julia、Janet 和 V8 的解决方案,但我找不到任何明显的解决方案。在多线程环境中只使用一对 root 和 unroot 函数是否安全?
我正在尝试为我的脚本语言构建一个简单的停止世界标记并清除垃圾收集器, 我正在努力使所有需要线程安全的东西变得安全。目前我的垃圾收集器有两个单链表,一个用于分配的对象,另一个用于根,受全局互斥锁保护。
【问题讨论】:
-
你为什么要取消一个显然仍在使用的值(因为你要返回它)?答案应该是显而易见的。永远不要取消根目录来再次根目录,即使是单个 CPU 周期。
标签: multithreading garbage-collection