一种在C语言中用 System V ucontext 实现的协程切换 原 荐

一种在C语言中用 System V ucontext 实现的协程切换

  misskissC 发布于 今天 10:08

字数 438

阅读 102

收藏 0

Coroutine Python CLanguage

此文在看了 python 中基于 yieldyield from (同步基于 yield 的子生成器/协程)机制的生成器/协程后,就想在C语言中实现类似机制。

在阅读 System V ucontext 手册后,便选择基于他来实现(要是此文自己实现“上下文切换描述”的话,该部分功能所花时间应该会比已有C代码所花时间要多)。所实现功能包括:

  1. yield
  2. yield from
  3. 基于 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之上。

用过 System V ucontext 或对CPU执行程序原理有所理解的同学应该都能胜任对该程序的阅读理解,有兴趣或与此文具相同程序理念(从源码或文档中可以看出一些吧)的同学一起出出新招继续提升下该程序吧。

© 著作权归作者所有

打印

misskissC

粉丝 0

博文 1

码字总数 426

作品 0

南岸

程序员

提问

加载中

评论( 3 )

红薯

49分钟前

代码放 gitee 上呗,github 时不时访问不了:)

misskissC

博主

14分钟前

已同步到gitee

红薯

5分钟前

不搞个 License 呀:)

删除一条评论

评论删除后,数据将无法恢复

取消

确定

相关文章 最新文章

协程(coroutine)学习笔记

什么是协程(coroutine) Wiki定义: Coroutines are computer-program components that generalize subroutines for non-preemptive multitasking, by allowing multiple entry points for ......

Jiang阿涵

2018/10/26

0

0

轻量级协程库-C语言实现

协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际...

follitude

2016/09/26

144

0

教你在 C 语言上编写自己的协程

协程介绍 总所周知,协程这个概念已经是服务端开发领域中耳熟能详的名词了。说协程是一组程序组件,以往的多线程编程有个特点是需要来回进行系统级别的来回上下文切换,造成很大的系统开销,...

thomaston

2019/09/29

0

0

协程分析之context上下文切换

协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持。 最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, boo...

ruki

2016/10/28

220

0

游戏引擎Mojoc,(7)C使用goto label地址实现协程

C 语言实现协程,最困难的部分就是上下文信息的保存和还原。这样才能够做到,让协程在任意位置让出执行权限,稍后再恢复到中断位置继续执行。C 实现协程一般有几个方案。 使用第三方库来保存...

scottcgi

2017/10/19

0

0

没有更多内容

加载失败,请刷新页面

加载更多
教你如何同时运行经典版和Chromium版Edge浏览器

微软表示,基于Chromium的Edge浏览器将于2020年1月15日正式登陆Windows 10、Windows 7和macOS平台。届时微软不仅会为上述平台提供独立的安装包,而且还会随Windows 10新版本一起发布。 这意味...

Linux就该这么学

26分钟前

25

0

linux "No space left on device" 磁盘空间解决办法

1.查看磁盘空间 df -h [root@izbp190idbje1fp4hnpk54z /]# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 40G 23G 15G 61% /devtmpfs 3.9G ......

时刻在奔跑

59分钟前

47

0

一种在C语言中用 System V ucontext 实现的协程切换

此文在看了 python 中基于 yield 和 yield from (同步基于 yield 的子生成器/协程)机制的生成器/协程后,就想在C语言中实现类似机制。 在阅读 System V ucontext 手册后,便选择基于他来实...

misskissC

今天

102

3

fish

sudo apt install fishcurl -L https://get.oh-my.fish | fishomf install edenomf theme eden...

xfan1503

今天

23

0

01.Linux 常用命令

Centos7 修改主机名 查看当前的主机名 [root@localhost datas]# hostnamelocalhost[root@localhost datas]# hostnamectl   Static hostname: localhost.localdomainTransient host......

AIRPAN

今天

15

0

没有更多内容

加载失败,请刷新页面

加载更多
我来评几句
登录后评论

已发表评论数()

相关站点

热门文章