1

Boehm GC 中线程与纤维的处理有什么区别?

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

4

1 回答 1

0

首先,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-10-09T08:00:15.597 回答