首页
学习
活动
专区
圈层
工具
发布

微信phxrpc源码分析(四)-phxrpc协程设计思路

本章继续介绍下phxrpc协程设计思路。看看别人是怎么包装底层库的。

1 UThreadRuntime设计思路

phxrpc的协程对外暴露的接口在UThreadRuntime中,这个类封装了操作系统提供的协程基础函数。并保证了多个协程间的切换是有序的

  1. UThreadRuntime设计核心是一个vector、三个方法。一个vector是图中的ContextSlot0,三个方法是Create、Resume、Yield
  2. vector存在的目的是:一个线程中同时存在多个协程,这些协程应该放在一个可索引的容器里,让外面的逻辑很容易调度到
  3. ContextSlot封装了当前协程的状态:UTHREAD_SUSPEND\UTHREAD_SUSPEND等。也封装了协程的调度方法,Resume、Yield和Make
  4. UThreadContextSystem类封装了基础的方法:getcontext、makecontext、swapcontext
  5. 用户需要关心的就是UTreadRuntime中的Create、Resume和Yield方法

2 phxrpc的协程是如何执行自定义方法的

阅读源码时候,很多同学会关注自定义的方法是如何执行的。自定义方法通过UThreadRuntime的create接口传入,但具体到在UThreadContextSystem::Resume和UThreadContextSystem::Yield之间是如何切换的,需要额外说明下。

首先上图的情形对应到程序大概是下面这样子:

代码语言:txt
复制
UThreadRuntime runtime_;

int id = runtime_.Create; //传入自定义方法

runtime_.Resume(id);//执行自定义方法,具体到上图,就是执行uc->func_方法,箭头1处

//自定义方法uc->func_执行过程中调用了runtime_Yield()方法,箭头2处
//跳出自定义方法,继续执行下面的函数流程,箭头3处
…………
runtime_.Resume(id)//在需要的地方回到自定义方法un->func_内继续执行,箭头4\5处
  • 这里为了好理解,把swapcontext函数分割成了swapcontext begin和swapcontext end,自定义方法是在swapcontext中执行的
  • 注意Resume和Yield方法虽然都调用了swapcontext,但协程调度顺序是有区别的,Resume是swapcontext(main now),Yield是swapcontext(now main),now代表当前协程,main是主协程

3 协程的回收

在使用协程中,需要注意协程也是需要回收的。这就需要写程序时候,关注协程的生命周期,分两种情况:

  1. 如果想在程序正常存活期间该协程一直存在,那么自定义的协程方法应该是while或者for循环,保证自定义方法不会停止
  2. 如果该协程是一次性的,那么应该关注该协程结束后的处理流程
下一篇
举报
领券