之前听说C++20也引入了协程,但是不完善,估计要等到C++23。所以当时去剖析了腾讯微信开源的libco,顺便也学习一下协程的知识。 协程又称用户态的线程,是因为其之间的切换是只在用户态进行的,而不需要切换入内核态。就像一个进程有多个线程一样,一个线程也有多个协程。在libco中,一个协程只能运行在一个线程中,其和线程的关系类似于进程之于CPU。这里是跟go语言协程不同的第一个点。 第二个点就是,go语言的协程是对称式的,其协程之间的调度由调度器来resume,然后协程中断执行也会将CPU使用权yield回调度器。而libco这里则是非对称式的,其使用一个pCallStack来跟踪当前的协程调用情况,栈顶永远都是当前正在执行的协程。栈底则是主协程所在的地方,主协程也就是main函数那个协程,其在调用resume其他协程之后就进入了eventloop中负责调度其他协程。而当前的栈顶协程当执行完后,其就出栈,栈顶指针--,也就是将CPU使用权yield到它下面的那个协程。