C++ 如何使用Boost.Coroutine与Boehm GC?

C++ 如何使用Boost.Coroutine与Boehm GC?,c++,boehm-gc,boost-context,boost-coroutine,C++,Boehm Gc,Boost Context,Boost Coroutine,协同程序分配自己的调用堆栈。博姆GC认为这些堆栈上的指针是根,如果不是,我怎么才能做到呢?上下文切换到协同路由后,Boehm终止程序。可能是Boost中的代码。协同路由保存指向其分配的调用堆栈的指针,并将其存储在“常用”位置之一以存储指针(例如,某个指针变量) 如果是这种情况,那么是的,GC将“追踪”指针从存储它的变量到调用堆栈,并从那里(递归地)通过它包含的任何指针。目前boost没有提供一种连接到分段堆栈分配的方法,因此这里有一个固定大小堆栈的解决方案 #包括 #包括 #包括 #包括 #包括

协同程序分配自己的调用堆栈。博姆GC认为这些堆栈上的指针是根,如果不是,我怎么才能做到呢?上下文切换到协同路由后,Boehm终止程序。

可能是Boost中的代码。协同路由保存指向其分配的调用堆栈的指针,并将其存储在“常用”位置之一以存储指针(例如,某个指针变量)


如果是这种情况,那么是的,GC将“追踪”指针从存储它的变量到调用堆栈,并从那里(递归地)通过它包含的任何指针。

目前boost没有提供一种连接到分段堆栈分配的方法,因此这里有一个固定大小堆栈的解决方案

#包括
#包括
#包括
#包括
#包括
类boehmgstackallocator{
boost::coroutines2::protected\u fixedsize\u堆栈;
//这是特定于boost::coroutines2::protected\u fixedsize\u堆栈的。
//堆栈保护页包含在sctx.size中,因此我们必须
//从堆栈大小中减去一页大小。
std::size\u t pfss\u可用的堆栈大小(boost::context::stack\u context&sctx){
返回sctx.size-boost::context::stack_traits::page_size();
}
公众:
boost::context::stack_context allocate(){
auto-sctx=stack.allocate();
//不管boost文档警告什么,唯一的*实现的*堆栈方向
//这就是我们减去堆栈大小的原因。
GC_add_root(静态_cast(sctx.sp)-pfss_可用_堆栈_size(sctx),sctx.sp);
返回sctx;
}
无效释放(boost::context::stack\u context sctx){
GC_移除_根(静态_转换(sctx.sp)-pfss_可用_堆栈_大小(sctx),sctx.sp);
堆栈解除分配(sctx);
}
};
然后在创建协同程序时提供它

auto coro = boost::coroutines2::coroutine<std::string>::pull_type(BoehmGCStackAllocator{}, [&](coro_t::push_type & yield) {
   // ...
}
auto coro=boost::coroutines2::coroutine::pull_类型(BoehmGCStackAllocator{},[&](coro_t::push_类型和收益){
// ...
}

Boehm崩溃,说它找不到当前线程的堆栈。:(更新以排除堆栈溢出保护保护页。这是在具有开放SEGFULT问题的Nix语言的未发布版本中使用的。YMMV。