Protothreads
- 通过链接 http://dunkels.com/adam/pt/download.html 进行下载相关版本的ptthread库
主要特点:
- 非常小的RAM开销-每个protothread只有两个字节,没有额外的堆栈
- 高度可移植性-protothreads库是100%纯C,没有特定于体系结构的汇编代码
- 可以与操作系统一起使用,也可以不使用操作系统
- 提供阻塞等待,无需完全多线程或堆栈切换
- 在类似BSD的开源许可证下免费提供
使用场景
- 内存受限系统
- 事件驱动协议栈
- 小型嵌入式系统
- 传感器网络节点
- 便携式C应用程序
注意事项:
由于原线程不会在阻塞调用中保存堆栈上下文,因此当原线程阻塞时,不会保留局部变量。这意味着应该非常小心地使用局部变量——如果有疑问,不要在protothread中使用局部变量! 一个原线程是由对运行该原线程的函数的重复调用驱动的。每次调用函数时,原线程都会运行,直到它阻塞或退出。因此,原线程的调度由使用原线程的应用程序完成。
相关头文件
- lc-addrlabels.h 用GCC语法扩展实现的协程基础
- lc-switch.h 用switch语句实现的协程基础
- lc.h 该文件存在的意义仅仅为了选择以上两者之一
- pt.h 基于lc.h的协程设施的真正实现
- pt-sem.h 协程间通信(信号量)的实现
相关API:
- void PT_INIT(struct pt *pt);//初始化一个protothread。
- void PT_BEGIN(struct pt *pt);// C函数中声明协程的开始。
- void PT_WAIT_UNTIL(struct pt *pt, condition);//阻塞并等待条件为真。
- void PT_WAIT_WHILE(struct pt *pt, condition);//条件为真时,阻塞并等待。
- void PT_WAIT_THREAD(struct pt *pt, thread);//阻塞并等待协程完成。
- void PT_SPAWN(struct pt *pt, struct pt *child, thread);//生成一个协程并等待它退出。
- void PT_RESTART(struct pt *pt);//重新启动协程。
- void PT_EXIT(struct pt *pt);//退出协程序
- void PT_END(struct pt *pt);//声明协程的结束。
- int PT_SCHEDULE(protothread);//创建一个协程
- void PT_YIELD(struct pt *pt);//当前原线程的产量。