一个C/C++协程库的思考与实现之协程的跨线程负载均衡调度

本文探讨了在多线程环境中使用协程库时的负载均衡问题,提出了协程跨线程调度的可行性,并详细讨论了解决方案,包括协程ID唯一性、负载判断和协程迁移策略。

https://github.com/DoasIsay/ToyCoroutine

其实一开始我并不想让ToyCoroutine支持多线程,多进程SO_REUSEPORT其实也挺好的,大家各跑各的互不影响,但在写代码时我又时刻考虑到多线程,毕竟,没有多线程间的同步协作那该是多么的无聊啊,,,

我在想当在多线程环境中使用协程库时,比如在一台8核的机器上,创建7个线程(调度器线程),每个线程负责一部分协程的调度执行,如何避免一些线程很忙,另一些线程却很空闲处于无协程可调度执行的状态?

把忙的线程中的协程分一部分到闲的线程中,在这个过程中要保证不能破坏协程运行的上下文环境,首先要从理论上分析它的可行性,如果理论上不可行,就不用再去瞎折腾了

这其实就是要协程能被跨线程调度,即一个协程可以在合适的时机(状态不为RUNNING)与当前调度器线程解绑,然后绑定到其它调度器线程,被任一个调度器线程调度运行

我所认为的协程就是一个函数的调用过程,从一个函数调用链的某个栈帧跳到另一个合适的函数调用链的某个栈帧就是协程的调度切换

  

如上图协程的上下文的保存与恢复,在一个线程中save协程的上下文,在另一个线程中restore它,这会导致什么问题?这与同一个线程中的协程上下文的save/restore有什么不同?简直一样,没有什么不同,,,

同一个进程内所有线程共享进程的虚拟地址空间,也就是一个线程是可以访问另一个线程栈上的局部变量而不会导致进程core掉,栈上的局部变量都可以访问,更何况堆中的一块内存?这里可以把协程看做一块内存,跨线程调度,即:把一个线程调用了一半的函数调用让另一个线程去继续调用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值