有没有办法通过保存/恢复堆栈来使用带有共享堆栈的boost上下文make_fcontext / jump_fcontext来共享协程内存?
似乎 make_fcontext 和 jump_fcontext 在堆栈上自行写入,并且在尝试在yield / resume上保存/恢复堆栈时遇到崩溃,但实际上很难我得到的结果是make_fcontext / jump_fcontext是纯汇编代码。
以下是触发分段错误的协程方法(如果我为每个协程使用不同的堆栈而且我不使用saveStack / restoreStack,则相同的代码工作得非常好)
void resume()
{
if (yielded)
{
restoreStack();
yielded = false;
}
else
{
running = true;
thisContext = boost::context::make_fcontext(
(char*)sharedStackPtr + sharedStackSize ,
sharedStackSize,
my_entry_func);
}
boost::context::jump_fcontext(&yieldContext, thisContext, reinterpret_cast<intptr_t>(this));
}
void yield()
{
yielded = true;
saveStack();
boost::context::jump_fcontext(&thisContext, yieldContext, 0);
}
void restoreStack()
{
char* stackTop = (char*)sharedStackPtr + sharedStackSize ;
memcpy(stackTop - savedStackSize, savedStackPtr, savedStackSize);
}
void saveStack()
{
char dummy = 0;
char* stackPointer = &dummy;
char* stackTop = (char*)sharedStackPtr + sharedStackSize ;
assert((stackPointer < stackTop) && (stackPointer >= sharedStackPtr ));
savedStackSize = stackTop - stackPointer;
if (savedStackPtr == nullptr)
{
savedStackPtr = coroutine_stack_alloc(savedStackSize);
}
else
{
savedStackPtr = coroutine_stack_realloc(savedStackPtr, savedStackSize);
}
memcpy(savedStackPtr, stackPointer, savedStackSize);
}
有什么想法吗?我在某处做错了吗?
答案 0 :(得分:1)
make_fcontext()必须应用于堆栈,以便在可以与jump_fcontext()一起使用之前初始化堆栈。当然,你可以在执行上下文完成后通过应用make_fcontext()重新使用堆栈。