Boehm GC 是否将 Win32 Fibers 堆栈识别为根?

Does Boehm GC recognize the stacks of Win32 Fibers as roots?

Boehm GC 中线程与纤程的处理有何不同?

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

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

对于协程(纤程),目前无法注册(但可以通过拦截 CreateFiber、EndFiber 和 SwitchToFiber 来注册)。目前让 GC 知道纤程的唯一方法是手动更新当前(常规)线程的堆栈底部(即获取 GC 锁并在切换到另一个纤程时调用 GC_set_my_stackbottom)。有关 low-level 详细信息,请参阅 https://github.com/ivmai/bdwgc/issues/274

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