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 で実装されたユーザーレベルのスレッドを見ましたが、スレッドがどのように切り替わるのかわかりません。上記のコードでは、これが機能した後、 ratherswapcontext
のコンテキストは?内にある必要があります。しかし、コンテキストは lastID ブレークポイントを持つスレッドにあります。に保存された「現在のコンテキスト」が現在の関数内のコンテキストではなく、古いスレッドのコンテキストであることは非常に混乱しています。コード全体はhttps://github.com/Miaoshuai/CoroutineにありますthreadMap_[lastId].get()
threadSchedule
swapcontext(ucontext_t *oucp, ucontext_t *ucp)
oucp
threadSchedule(int n)