繁体   English   中英

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

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

Boehm GC 中 Threads 和 Fibers 的处理有什么区别?

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)。 有关低级详细信息,请参阅https://github.com/ivmai/bdwgc/issues/274

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM