Protothreads
Protothreads是一种低开销的并发编程机制。Protothreads充当无栈的轻量级线程或协程,它使用了极小的每protothread内存:一个短整数保存执行位置,一个字节作为让步标志。
简介
Protothreads可用于实现叫做协作式多任务的非抢占形式的并发计算,故而在一个线程yield(让步)给另一个线程的时候不会招致上下文切换。为了在一个protothread内达成yield,在线程函数内利用了达夫设备并在其switch语句内使用一个函数外部的变量。这允许在另一次函数调用时跳转(恢复)到上次的yield的地方。为了阻塞线程,这些yield要通过等待条件来守卫,使得后续的对同样这个函数的调用仍然yield,直到这个条件表达式是为真值为止。
protothread的概念是Adam Dunkels和Oliver Schmidt开发的[1],基于了Simon Tatham[2]和Tom Duff[3]此前的工作。
评价
Protothreads与其他协程或纯线程实现有关的特征是它们都是无栈的。这有好处也有坏处。坏处是在protothread内的局部变量,在经历了yield而再恢复执行之后,不能信任它们仍保留了原来的值。它们要保持自己的状态,就必须通过使用静态变量或函数外部的变量,经常是全局变量[4]。好处是它们是非常轻量级的,因而可用于很多内存受限的系统,就像对于小型微控制器,其他解决方案可能是不现实的或不是真想要的。
知名于达夫设备的Tom Duff,曾评价这种方法的缺点:“探究一种类似在中断驱动的状态机中所用到的技巧太恐怖了。[...] 我从来都不认为它是胜任的通用协程实现,因为要拥有一个协程的多个同时活动是不容易的,并且使用这种方法要使协程在除了在顶层例程内以外任何地方放弃控制权都是不可能的。简单的汇编语言栈交换库就能让你做到这二者。”[3]
参见
引用
- ^ Adam Dunkels. Protothreads - Lightweight, Stackless Threads in C. Dunkels.com. [April 21, 2017]. (原始内容存档于2019-12-09).
- ^ 存档副本. [2019-11-26]. (原始内容存档于2019-11-09).
- ^ 3.0 3.1 存档副本. [2019-11-26]. (原始内容存档于2019-07-23).
- ^ A. Dunkels, O. Schmidt, T. Voigt, and M. Ali, Protothreads: Simplifying Event-Driven Programming of Memory-Constrained Embedded Systems, Proc. ACM SenSys, Boulder, CO, USA, Nov 2006. (PDF (页面存档备份,存于互联网档案馆), Presentation slides (页面存档备份,存于互联网档案馆))
外部链接
- Protothread library in C(页面存档备份,存于互联网档案馆),用于Contiki操作系统
- Using Protothreads for Sensor Node Programming(页面存档备份,存于互联网档案馆),PDF版论文中有对使用Protothreads的一些深入讨论
- Protothread library(页面存档备份,存于互联网档案馆),要求GCC,包括了建模在UNIX内核上的一个线程调度器(一种简化形式的POSIX条件变量),这个源代码也包括对多CPU核心(处理器)的支持。
- Protothreads (coroutines) in C99. Highly portable, but work best in low-end embedded systems. (页面存档备份,存于互联网档案馆)