非常精简的开源 C 协程库:Protothreads

分享到:
开源 C 协程库 protothreads。这是一个全部用 ANSI C 写成的库,之所以称为“蝇量级”的,就是说,实现已经不能再精简了,几乎就是原语级别。事实上 protothreads 整个库不需要链接加载,因为所有源码都是头文件,类似于 STL 这样不依赖任何第三方库,在任何平台上可移植;总共也就 5 个头文件,有效代码量不足 100 行;API 都是宏定义的,所以不存在调用开销;最后,每个协程的空间开销是 2 个字节(是的,你没有看错,就是一个 short 单位的“栈”!)当然这种精简是要以使用上的局限为代价的。

主要特性: 

  • 非常小的内存开销 - 每个原始线程只有两个字节,没有多余的堆栈
  • 高度便携 - Protothreads库是100%纯C开发
  • 可以在操作系统中使用或单独使用
  • 提供阻塞等待而不完整的多线程或堆栈切换
#include "pt.h"
struct pt pt;
struct timer timer;
PT_THREAD(example(struct pt *pt))
{
PT_BEGIN(pt);
while(1) {
if(initiate_io()) {
timer_start(&timer);
PT_WAIT_UNTIL(pt,
io_completed() ||
timer_expired(&timer));
read_data();
}
}
PT_END(pt);
}

协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法“子例程是协程的特例”,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。只不过子例程只有一个调用入口起始点,返回之后就结束了,而协程入口既可以是起始点,又可以从上一个返回点继续执行,也就是说协程之间可以通过 yield 方式转移执行权,对称(symmetric)、平级地调用对方,而不是像例程那样上下级调用关系。当然 Knuth 的“特例”指的是协程也可以模拟例程那样实现上下级调用关系,这就叫非对称协程(asymmetric coroutines)。


详见:http://coolshell.cn/articles/10975.html
昵    称:
验证码:

相关文档:

  • C语言的SPDY开发包 spdylay
    spdylay 是 C 语言实现对 SPDY v2/3 协议支持的库...
  • 开源编译器 Open64
    Open64最初的名字叫Pro64,后改名为Open64,采用GPL许可证,参与开发的机构包括了SGI、中科院、惠普和特拉华大学。...
  • Python 开发的 C/C++ 预处理器:CPIP
    CPIP 是一个用 Python 开发的 C/C++ 预处理器。CPIP 可输出预处理的所有方面信息便于检查。...
  • Command Line Progress Bar
    这是一个在 Linux 下用 C 语言写的控制台下的进度条,如下图所示:...
  • Windows下用Eclipse搭建C/C++开发环境
    Windows下C/C++的IDE有很多,要学习Eclipse,所以就选下面要讲的Eclipse + GNU toolchain(话说toolchain这个词很形象)....
  • Eclipse的C/C++开发环境 CDT
    Eclipse CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE。它被设计为将 Java 开发人员喜爱的许多 Eclipse 优秀功能提供给 C/C++ 开...
  • C++ Resources Compiler - 生成 C++ 源码文件
    C++ Resources Compiler 是一个工具,用来生成一个 C++ 源码文件,包括相应的头文件,用以嵌入任意数据文件并提供一个 Resource 类用来访问这...
  • 纯Java 实现的 C 语言预处理器 - JCPP
    JCPP 是一个完整、兼容、独立的纯Java 实现的 C 语言预处理器,其目的是为了使用编写在 Java 中可使用的 C 风格编译器...
  • 快速的 HTTP Header 解析C语言库:H3
    H3 是一个 C 语言实现的快速的 HTTP Header 解析库。H3使用预先建立的最小完美哈希表来定义header字段名称,以提供快速的字段名称查找。...
  • 如何编写一个PHP的C扩展
    C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWa...
  • google开源的C++性能分析工具 - gperftools
    gperftools是Google提供的一套工具,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈。...
  • 使用 gperf 实现高效的 C/C++ 命令行处理
    GNU 的 gperf 工具是一种 “完美的” 散列函数,可以为用户提供的一组特定字符串生成散列表、散列函数和查找函数的 C/C++ 代码。通...
  • Qt集成开发环境 QDevelop
    QDevelop 是一个用来开发基于 Qt4 应用程序的集成开发环境,要求 Qt4 的支持,Windows 需要 MinGW 支持。使用 gdb 做为调试工具,提供包括英语...
  • WebAppLib - 类Unix操作系统环境下Web开发的C++类库
    WebAppLib(Web Application Library)是一系列主要用于类Unix操作系统环境下Web开发的C++类库...
  • C++命令行参数解析器 CLPP
    C++ command line parameters parser (CLPP) 是一个命令行参数解析器,使用回调函数方式。只用于和 Boost C++ 库和 ISO C++ 使用。...
  • Python的特性
    python使用c语言开发 1.面向对象的特性 面向对象的程序设计抽象出对象的行为和属性,把行为和属性分离开,但是又合理的组织在...
  • C语言开发工具 PythoidC
    PythoidC是中国人研发的最方便的C语言开发工具,实现了易如Python快如C的最高境界:...
  • 高并发C++应用程序框架:saf application framework
    saf (saf application framework) 是一个高并发的c++应用程序框架,它以RPC为基础,提供了动态载入模块的特性,为服务端开发人员只用关注于程...
  • C++模板库 Standard Portable Library
    Standard Portable Library 是一个指针友好的 C/C++ 标准模板库的替代产品,它所提供的 API 跟 Java 或者是 .NET 的语言类似,包括公用的数据结构...
  • C++图像处理库 Pandore
    Pandore 是一个图像处理的标准函数库,当前版本支持 1D2D3D 图像。支持 灰度,颜色,或多光谱。...