首页 > 解决方案 > 关于在用户级线程实现中使用 ucontext.h 的线程切换问题

问题描述

void Mythread::threadSchedule(int n)
{
    if(threadMap_.size() > 1)
    {
        int lastId = current_;  
        if(current_ != (--threadMap_.end())->first)
        {
            auto it = threadMap_.find(current_);
            current_ = (++it)->first;
        }
        else
        {
            current_ = threadMap_.begin()->first;
        }

        swapcontext(threadMap_[lastId].get(),threadMap_[current_].get());
    }
}

最近看到一个用ucontext实现的用户级线程,就是不明白线程是怎么切换的。在上面的代码中,swapcontext完成它的工作之后,threadMap_[lastId].get()相当的上下文应该在threadSchedule?但是上下文在带有 lastID 断点的线程中。swapcontext(ucontext_t *oucp, ucontext_t *ucp)令人困惑的是,保存到的“当前上下文”oucp不是threadSchedule(int n)现在函数内部的上下文,而是旧线程的上下文。整个代码在https://github.com/Miaoshuai/Coroutine

标签: c++clinuxmultithreadingucontext

解决方案


推荐阅读