每日一博 | 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执行程序原理有所理解的同学应该都能胜任对该程序的阅读理解,有兴趣或与此文具相同程序理念(从源码或文档中可以看出一些吧)的同学一起出出新招继续提升下该程序吧。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android Studio 3.6 RC 2 发布
Android Studio 3.6 RC 2 发布了,包括针对以下公共问题的修复: Android Studio Issue #146520216: 将 Studio 3.6.0-beta05 升级到 3.6.0-rc01 会破坏矢量可绘制对象的packageDebugResources Editing Issue #147039508: Bug: IDE 建议使用特定版本的 Libphonenumber,但选择该版本时实际上不执行任何操作 Gradle Issue #142242084: 在 AS 3.6 Canary 12 上,assembleDebug 失败,并出现 FileNotFoundException Gradle Sync Issue #129261435: 升级后如果 distributionSha256Sum 不匹配,则 Android 同步会挂起 Lint Issue #146403481: Android Studio 3.6 不执行模块的 lint 检查 Shrinker (R8) Issue #146597396: R8 给出“请求校验和编码时没有校验及信...
-
下一篇
阿里云数据分析最佳实践:二维数据可视化 + 设备数据下发
概述 物联网数据分析,又称Link Analytics,是阿里云为物联网开发者提供的设备智能分析服务,全链路覆盖了设备数据生成、管理(存储)、清洗、分析及可视化等环节。有效降低数据分析门槛,助力物联网开发工作。这里分别演示通过二维数据可视化功能展示设备位置 + 通过数据分析实现定时下发数据到设备。 Step By Step 1、创建产品,导入物模型,参考链接 物模型json内容 { "schema": "https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json", "profile": { "productKey": "a1kVHWEOsM2" }, "properties": [ { "identifier": "GeoLocation", "name": "地理位置", "accessMode": "rw", "required": true, "dataType": { "type": "struct", "specs": [ { "identifier": "Longitude", "name": "经度", "d...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- MySQL数据库中FOR UPDATE的使用
- Red5直播服务器,属于Java语言的直播服务器
- Mario游戏-低调大师作品
- Docker容器配置,解决镜像无法拉取问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程

微信收款码
支付宝收款码