从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.
感兴趣的小伙伴欢迎一起参与
代码地址
协程切换原理
使用glibc中<ucontext.h>提供的相关函数
用户态切换简单来说就是保存当前上下文,切换到新的上下文.
用户态程序的上下文一般包含如下信息:
- 栈
- 各种寄存器
- 信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息
我们来看一下glibc定义的用户态上下文结构ucontext_t:
typedef struct ucontext_t
{
unsigned long int __ctx(uc_flags);
struct ucontext_t *uc_link; // 链接下一个ucontext_t,当前上下文结束后自动切换到这个上下文,用于被动切换
stack_t uc_stack; // 当前上下文的栈信息, 24字节
mcontext_t uc_mcontext; // 当前上下文的通用寄存器, 23个通用寄存器,1个指向fpu结构的指针,64字节保留信息. 总共256字节
sigset_t uc_sigmask;