协程在C++20中已经加入了,但并不完善,C++标准库的协程将在C++23中正式推出。其它语言,例如go、python也是默认支持协程,C++相对来说落后了。
Boost在1.53版本就推出了协程库,本篇博客基于Boost1.76版本,来介绍协程库。1.53版本的BoostCoroutine 现在已被弃用,请使用Boost.Coroutine2。
什么是协程
在谈协程之前,我们先谈谈函数,函数有入口地址,而且只有一个,返回也只有一个,而协程却可以多次进入,多次返回。
协程,英文名是称为Coroutine,微信的后台C++库,libco也应用了大量协程,早在2013年已经开源,有兴趣的可以去拜读。可以在指定地点暂停协程和恢复协程,这意味着协程会保存自己的上下文,不同于线程, 协程的上下文保存是不需要进入内核态的,完全可以在用户态完成。
下面看看协程的分类:
有栈协程
每个协程都拥有自己的栈,协程上下文保存在自己的栈中,切换协程就是切换栈,然后恢复栈中的上下文,这种方法