热门问题
时间线
聊天
视角
Protothreads
来自维基百科,自由的百科全书
Remove ads
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]
參見
引用
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads