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. (頁面存檔備份,存於互聯網檔案館)