使用context实现的C++协程库

本文介绍了如何使用context API在C++中实现协程库,详细解析了ucontext数据类型、getcontext、makecontext、setcontext和swapcontext等函数在协程上下文保存和恢复中的作用。并展示了coroutine结构体的设计,包括schedule和coroutine类,以及在测试中的性能表现,如每秒7e5次协程切换。
摘要由CSDN通过智能技术生成

先上大佬的github,这个协程库的实现主要参考大佬的思路,所做的工作只是将代码做一个面向对象的封装。

协程是什么?

协程其实可以理解成一种更细粒度的线程,不同的协程在一个线程中执行不同的代码序列,但是不需要进行线程的切换,也有人把这种实体叫做用用户级线程。其他的语言例如Python和Golang中都有比较完善的对协程的实现。要实现协程主要是要能保存和恢复上下文。

运用context保存协程上下文

在linux和MacOS的早起版本上都提供了context相关的API,这些API是用来实现协程库的一个关键,这里简单介绍一下。

ucontext数据类型

这个是用来保存线程上下文的主要数据结构,在Unix的手册(man)中有如下介绍:

The ucontext_t structure contains at least these fields:
ucontext_t *uc_link context to assume when this one returns
sigset_t uc_sigmask signals being blocked
stack_t uc_stack stack area
mcontext_t uc_mcontext saved registers

  • uc_link主要指向的是当前上下文返回之后指向的上下文
  • uc_mcontext主要是保存一些寄存器
  • uc_sigmask主要保存阻塞信号量集(apue中有介绍)
  • uc_stack主要是保存堆栈信息

getcontext

函数原型:

int getcontext(ucontext_t *ucp);

这个函数主要是将当前进程的上下文保存到ucp指向的数据结构里,为了后续的setcontext 调用

makeconte

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值