干货写在前面
协程的概念就不详细介绍了,不清楚的同学可以自己google,windows和unix like系统
本身就提供了协程的支持,windows下叫fiber,unix like系统下叫ucontext.
协程是一种用户态的轻量级线程。本篇主要研究协程的 C/C++ 的实现。
首先我们可以看看有哪些语言已经具备协程语义:
- 比较重量级的有 C#、erlang、golang*
- 轻量级有 python、lua、javascript、ruby
- 还有函数式的 scala、scheme 等。
c/c++ 不直接支持协程语义,但有不少开源的协程库,如:
Protothreads:一个 “蝇量级” C 语言协程库
libco: 来自腾讯的开源协程库 libco 介绍,官网
coroutine: 云风的一个 C 语言同步协程库, 详细信息
目前看到大概有四种实现协程的方式:
- 第一种:利用 glibc 的 ucontext 组件 (云风的库)
- 第二种:使用汇编代码来切换上下文 (实现 c 协程)
- 第三种:利用 C 语言语法 switch-case 的奇淫技巧来实现(Protothreads)
- 第四种:利用了 C 语言的 setjmp 和 longjmp( 一种协程的 C/C++ 实现, 要求函数里面使用 static local 的变量来保存协程内部的数据)
本篇主要使用 ucontext 来实现简单的协程库。
. . .