在C++中实现协程
我在整理tars和taf的协程逻辑的时候,也实现了一个纯净版的协程框架以便于理解
本来是计划将sheep_cpp这个在魅族时实现的c++的rpc框架重新捡起来优化一下,再写下这一篇文章
但是一直鸽到现在,所以暂时先给协程框架单独来一篇文章
协程实现在这里sheep_cpp/src/coroutine/
协程框架总览
classDiagram
direction TB
namespace 协程框架 {
class CoroutineInfo协程 {
+registerFunc()
+switchTo(CoroutineInfo *to) : 切换到目标协程
+switchBack() : 切换回主协程
}
class CoroutineScheduler协程调度器 {
+start() : 用于启动这个协程调度器在独立线程里
+addCoroutine(F && func) : 用于其他线程给这个线程添加协程任务
+yield() : 用于挂起协程,让给其他协程执行,空闲时再转回自己
+suspend() : 用于挂起协程,必须通过resume唤醒
+resume(CoroutineInfo*) : 用于唤醒suspend挂起的协程
+sleep() : 用于定时休眠后唤醒,可以用suspend和resume封装
}
class CoFuture {
+wait() : 在线程内,使用promise,future;在协程内,使用suspend,resume
}
class CoASyncer {
+getInstance() : 获取单例
+CoFuture async(F && func) : 获取一个CoFuture
}
}
CoroutineInfo协程 "N" --* CoroutineScheduler协程调度器
CoASyncer ..> CoFuture
CoFuture ..> CoroutineScheduler协程调度器
CoASyncer ..> CoroutineScheduler协程调度器
namespace 网络框架 {
class EventLoop事件循环 {
-run() : 在一轮poller后调用yield
}
class Server {
+SetConnectedHandler() : 连接建立以后创建一个新协程
}
class Client {
+AsyncConnect(F && func)
+Connect() : 调用AsyncConnect的func里面resume(),设置完回调suspend()
}
class TcpConnection {
+AsyncRead(F && func)
+Read() : 调用AsyncRead的func里面resume(),设置完回调suspend()
}
}
note for EventLoop事件循环 "1 服务端线程整个由调度器托管<br>EventLoop是调度器的一个协程<br>2 异步回调可以全部套一层<br>来实现同步回调"
EventLoop事件循环 ..> CoroutineScheduler协程调度器
Client ..> CoASyncer
Client ..> TcpConnection
Server ..> EventLoop事件循环
Server ..> TcpConnection
TcpConnection ..> CoASyncer