每日一博 | 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将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- 2048小游戏-低调大师作品
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境