【问题标题】:Does Boehm GC recognize the stacks of Win32 Fibers as roots?Boehm GC 是否将 Win32 光纤堆栈识别为根?
【发布时间】:2021-01-20 22:36:56
【问题描述】:

Boehm GC 中线程与纤维的处理有什么不同?

Win32 CreateFiber 只获取所需的堆栈大小并分配它,而不会让用户访问堆栈指针(据我所知)。 Boehm GC 是否自动将创建的堆栈识别为根?如果没有,我们如何让 GC 知道堆栈?我们使用 GetCurrentThreadStackLimits 吗?

【问题讨论】:

  • GC 只处理动态堆分配。 GC 为什么要处理堆栈?
  • 它必须跟踪堆栈中的指针以确定哪些对象仍然存在。
  • 你有没有挖掘过源代码,看看里面是否有任何纤维物质(如果有的话,我会很惊讶)?
  • 好的,没错。就像提到的源 available 阅读。但由于homepage 没有提及光纤,因此不太可能得到支持。
  • 还有来自 Hans Boehm 本人的something,当然可能已经过时了,但有所有其他“证据”......

标签: c winapi fibers boehm-gc


【解决方案1】:

首先,Boehm GC 需要扫描处理由 GC 分配的指针或调用 GC 函数的每个线程(或纤程)的堆栈。对于常规线程,有两种方法可以注册线程 - 调用 GC_CreateThread 来创建线程或 GC_register_my_thread 来注册当前线程。线程注册后,垃圾收集器自动处理线程。

如果是协程(fiber),目前没有办法注册(但是可以通过拦截CreateFiber、EndFiber和SwitchToFiber)。当前使 GC 了解纤程的唯一方法是手动更新当前(常规)线程的堆栈底部(即,在切换到另一个纤程时获取 GC 锁并调用 GC_set_my_stackbottom)。有关低级详细信息,请参阅https://github.com/ivmai/bdwgc/issues/274

关于 GetCurrentThreadStackLimits 的使用: 目前 BDWGC 使用 VirtualQuery 和 GetThreadContext 来确定堆栈的边界(堆栈的提交区域),我现在不知道 GetCurrentThreadStackLimits 如何改进这一点,至少对于常规线程而言。

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2012-08-03
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多