【问题标题】:make_fcontext/jump_fcontext used with shared stackmake_fcontext/jump_fcontext 与共享堆栈一起使用
【发布时间】:2017-03-12 18:55:50
【问题描述】:

有没有办法通过共享堆栈使用 boost 上下文 make_fcontext/jump_fcontext 通过保存/恢复堆栈来共享协程内存?

似乎 ma​​ke_fcontextjump_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);
    }

有什么想法吗?我有什么地方做错了吗?

【问题讨论】:

    标签: c++ coroutine boost-context


    【解决方案1】:

    make_fcontext() 必须应用于堆栈,以便在堆栈与 jump_fcontext() 一起使用之前对其进行初始化。当然,您可以在执行上下文完成后通过应用 make_fcontext() 来重用堆栈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2014-07-08
      相关资源
      最近更新 更多