Protothreads是一种低开销的并发编程机制。Protothreads充当无栈的轻量级线程协程,它使用了极小的每protothread内存:一个短整数保存执行位置,一个字节作为让步标志。

简介

编辑

Protothreads可用于实现叫做协作式多任务非抢占形式的并发计算,故而在一个线程yield(让步)给另一个线程的时候不会招致上下文切换。为了在一个protothread内达成yield,在线程函数内利用了达夫设备并在其switch语句英语Switch statement内使用一个函数外部的变量。这允许在另一次函数调用时跳转(恢复)到上次的yield的地方。为了阻塞线程,这些yield要通过等待条件来守卫,使得后续的对同样这个函数的调用仍然yield,直到这个条件表达式是为真值为止。

protothread的概念是Adam Dunkels英语Adam Dunkels和Oliver Schmidt开发的[1],基于了Simon Tatham[2]Tom Duff英语Tom Duff[3]此前的工作。

评价

编辑

Protothreads与其他协程或纯线程实现有关的特征是它们都是无栈的。这有好处也有坏处。坏处是在protothread内的局部变量,在经历了yield而再恢复执行之后,不能信任它们仍保留了原来的值。它们要保持自己的状态,就必须通过使用静态变量或函数外部的变量,经常是全局变量[4]。好处是它们是非常轻量级的,因而可用于很多内存受限的系统,就像对于小型微控制器,其他解决方案可能是不现实的或不是真想要的。

知名于达夫设备Tom Duff英语Tom Duff,曾评价这种方法的缺点:“探究一种类似在中断驱动的状态机中所用到的技巧太恐怖了。[...] 我从来都不认为它是胜任的通用协程实现,因为要拥有一个协程的多个同时活动是不容易的,并且使用这种方法要使协程在除了在顶层例程内以外任何地方放弃控制权都是不可能的。简单的汇编语言栈交换库就能让你做到这二者。”[3]

参见

编辑

引用

编辑
  1. ^ Adam Dunkels. Protothreads - Lightweight, Stackless Threads in C. Dunkels.com. [April 21, 2017]. (原始内容存档于2019-12-09). 
  2. ^ 存档副本. [2019-11-26]. (原始内容存档于2019-11-09). 
  3. ^ 3.0 3.1 存档副本. [2019-11-26]. (原始内容存档于2019-07-23). 
  4. ^ 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页面存档备份,存于互联网档案馆))

外部链接

编辑