协程分析之context上下文切换
协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持。 最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, boost, libco, libgo等等。 那么现有协程库,是怎么去实现context切换的呢,目前主要有以下几种方式: 使用ucontext系列接口,例如:libtask 使用setjmp/longjmp接口,例如:libmill 使用boost.context,纯汇编实现,内部实现机制跟ucontext完全不同,效率非常高,后面会细讲,tbox最后也是基于此实现 使用windows的GetThreadContext/SetThreadContext接口 使用windows的CreateFiber/ConvertThreadToFiber/SwitchToFiber接口 各个协程协程库的切换效率的基准测试,可以参考:切换效率基准测试报告 ucontext接口 要研究ucontext,其实只要看下libtask的实现就行了,非常经典,这套接口其实效率并不是很高,而且很多平台已经标记为废弃接口了(像macosx),目前主要是在linux下使用 libtask里面对不提供此接口的平台,进行了汇编实现,已达到跨平台的目的, ucontext相关接口,主要有如下四个: getcontext