libco 分析(下):协程的管理
前文 libco 分析(上):协程的实现 中我们介绍了 libco 使用汇编代码实现 协程上下文管理和切换的原理。今天我们继续介绍 libco 管理协程的逻辑,包括如何对 read
,write
等接口进行非侵入式改造以及 libco 的共享栈原理。
在继续下文之前想说明一点,相比于同是微信开源的 phxrpc,libco 整个代码的编码质量不算很高,代码风格比较杂乱,格式以及命名也没有严格遵循要求,并且缺乏功能上的注释。在代码中先后出现像函数 poll
,co_poll
,co_poll_inner
,co_eventloop
这种看起来很难区分功能的命名。但是我们在学习的过程中可以去其糟粕,取其精华,学习好的设计思想以及编程思路就可以了。
如何使用 libco
我们首先以 libco 提供的例子 example_echosvr.cpp 来介绍应用程序如何使用 libco 来编写服务端程序。 在 example_echosvr.cpp 的 main
函数中,主要执行如下几步:
- 创建 socket,监听在本机的 1024 端口,并设置为非阻塞;
- 主线程使用函数
readwrite_coroutine
创建多个读写协程,调用co_resume
启动协程运行直到其挂起。这里我们忽略掉无关的多进程 fork 的过程; - 主线程继续创建 socket 接收协程 accpet_co,同样调用
co_resume
启动协程直到其挂起; - 主线程调用函数
co_eventloop
实现事件的监听和协程的循环切换;