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