微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Boehm GC是否将Win32光纤堆栈识别为根?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。