Protothreads

主要特点:

  • 非常小的RAM开销-每个protothread只有两个字节,没有额外的堆栈
  • 高度可移植性-protothreads库是100%纯C,没有特定于体系结构的汇编代码
  • 可以与操作系统一起使用,也可以不使用操作系统
  • 提供阻塞等待,无需完全多线程或堆栈切换
  • 在类似BSD的开源许可证下免费提供

使用场景

  • 内存受限系统
  • 事件驱动协议栈
  • 小型嵌入式系统
  • 传感器网络节点
  • 便携式C应用程序

注意事项:

由于原线程不会在阻塞调用中保存堆栈上下文,因此当原线程阻塞时,不会保留局部变量。这意味着应该非常小心地使用局部变量——如果有疑问,不要在protothread中使用局部变量! 一个原线程是由对运行该原线程的函数的重复调用驱动的。每次调用函数时,原线程都会运行,直到它阻塞或退出。因此,原线程的调度由使用原线程的应用程序完成。

相关头文件

  1. lc-addrlabels.h 用GCC语法扩展实现的协程基础
  2. lc-switch.h 用switch语句实现的协程基础
  3. lc.h 该文件存在的意义仅仅为了选择以上两者之一
  4. pt.h 基于lc.h的协程设施的真正实现
  5. 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);//当前原线程的产量。