每日一博 | C语言中用 System V ucontext 实现的协程切换
此文在看了 python 中基于 yield 和 yield from (同步基于 yield 的子生成器/协程)机制的生成器/协程后,就想在C语言中实现类似机制。
在阅读 System V ucontext 手册后,便选择基于他来实现(要是此文自己实现“上下文切换描述”的话,该部分功能所花时间应该会比已有C代码所花时间要多)。所实现功能包括:
- yield
- yield from
- 基于 yield 和 yield from 机制协程的调度器 loop
这些功能皆在 ln_cs.c 中实现,experiences目录下为体验以上功能机制的例子(运行体验可参见 doc 目录下的文档)。
.
├── doc
│ ├── A coroutine switching implement ... in C-language.md
│ └── An optimization for ... in C-language.md
├── experiences
│ ├── make_e
│ ├── loop_e
│ │ ├── loop_e.c
│ │ ├── Makefile
│ ├── yield_e
│ │ ├── Makefile
│ │ └── yield_e.c
│ └── yield_from_e
│ ├── Makefile
│ └── yield_from_e.c
├── include
│ ├── ln_comm.h
│ └── ln_cs.h
├── readme.md
└── src
└── ln_cs.c
核心代码 ln_cs.c 经过此文的一些技巧性修剪后不到 500 行,所以还是很想分享的——便补写了文档与源码一起上传到了 github 和 gitee之上。
- github地址:https://github.com/misskissC/ucoroutine_switching
- gitee 地址:https://gitee.com/misskissC/ucoroutine_switching
用过 System V ucontext 或对CPU执行程序原理有所理解的同学应该都能胜任对该程序的阅读理解,有兴趣或与此文具相同程序理念(从源码或文档中可以看出一些吧)的同学一起出出新招继续提升下该程序吧。