c++ - 关于在用户级线程实现中使用 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
解决方案
推荐阅读
- javascript - 蜡速度移动 x 和 y
- jquery - 使用 laravel 和 jquery 取消选中单选按钮
- tcl - 映射/取消映射或提高/降低堆叠顺序以显示/隐藏选项卡式显示?
- c++ - C++ 比较器覆盖
- gspread - copy() 仍然使用参数 folder_id 抛出错误
- amazon-web-services - 为什么 AWS ELB EC2 实例在被调度程序停止后会重新启动?
- html - 如何使用 CSS 和 HTML 在圆圈上添加文本?
- docker - Perl 脚本不在 OpenShift/Cirrus/Hybrid Cloud 上运行,但在本地运行良好
- javascript - 无法读取未定义错误的属性“forEach”
- python - 在 python 3.x 中表示浮动无穷大的最佳实践