尝试搞了一个纯 C 的协程框架

2022-10-23 10:20:47 +08:00
 piaodazhu

协程近些年也比较火,了解了其机制后,越发觉得它确实是个好东西,平时用 C 比较多,于是想着动手弄一个 C 语言的协程。看了一些资料和项目之后,发现网上也不乏很多 C 实现的协程项目。看下来,每个项目都有各自适合的应用场景,比如 Protothreads 这类的蝇量级协程就更适合用于在嵌入式场景,带来的时空开销很小;还有一些轻量级项目,并不提供完善的功能,但是寥寥数百行代码就能把协程的机制交代清楚,很适用于学习;再往上看,一些大一点的项目可能就涉及到一些依赖......

总而言之,这些 C 协程项目多少存在改进空间,也都有各自发挥的舞台,这时我对自己这个项目的构想是:

  1. 可读性。代码可读性尽量高,易于维护,多年以后不写注释也能一眼看懂
  2. 实用性。功能尽可能完善,能支持一般场景,性能尽可能高
  3. 易用性。看示例就可以直接上手,示例应该清晰明了

这里并不是要搞标新立异立异,或者要在 C 协程上一统江湖。相信其他写过开源项目的朋友也能理解,写一个开源小项目很多时候不是为了物质追求,如果有人能用、对人有用、别人能提意见或鼓励,那就是莫大的荣誉。

项目地址: https://github.com/piaodazhu/dyco-coroutine (觉得可以麻烦给个 star

3099 次点击
所在节点    程序员
12 条回复
kwh
2022-10-23 12:24:36 +08:00
听说 Java 通过 nio 解决协程网络 IO 的阻塞,楼主怎么解决的?
weeei
2022-10-23 12:50:22 +08:00
heiher
2022-10-23 12:58:03 +08:00
不错,不错~ 我之前用 C 语言做一些网络工具,事件循环的回调写的实在不爽了,也撸了个 C 的协程实现 ( https://github.com/heiher/hev-task-system ),平常自用小项目里玩玩。
wangritian
2022-10-23 13:03:55 +08:00
go doSomething()
liqimore
2022-10-23 14:18:25 +08:00
支持楼主,之前一直用 argobot ,楼主这个用起来简单好多,希望可以维护下去
duckduckgo
2022-10-23 14:32:09 +08:00
支持
tulongtou
2022-10-23 20:22:25 +08:00
v 友真是卧虎藏龙,到我这才 6 楼,一半都自己搞协程,对不起,我拖了 v 友后腿了
bfjm
2022-10-23 23:10:14 +08:00
大佬
piaodazhu
2022-10-24 08:48:50 +08:00
@kwh 最主要的解决方式是在 IO 操作之前把描述符注册到调度器,以便进行统一监听。然后协程主动让出执行权。调度器会在监听到 IO 事件的时候唤醒对应的协程。用了 hook 以后,相当于给系统的 socket API 增加了上述的《注册-让出》行为。
piaodazhu
2022-10-24 09:02:57 +08:00
@heiher 这个项目好强,而且支持这么多平台,赶紧 star 了~
piaodazhu
2022-10-24 09:06:57 +08:00
多谢大家的支持!项目也会一直维护,如果有使用中的问题欢迎提 issue ~
ggvm
2022-10-26 18:10:15 +08:00
so diao

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/889054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX