非常精簡的開源 C 協程庫:Protothreads
開源 C 協程庫 protothreads。這是一個全部用 ANSI C 寫成的庫,之所以稱為“蠅量級”的,就是說,實現已經不能再精簡了,幾乎就是原語級別。事實上 protothreads 整個庫不需要鏈接加載,因為所有源碼都是頭文件,類似于 STL 這樣不依賴任何第三方庫,在任何平臺上可移植;總共也就 5 個頭文件,有效代碼量不足 100 行;API 都是宏定義的,所以不存在調用開銷;最后,每個協程的空間開銷是 2 個字節(是的,你沒有看錯,就是一個 short 單位的“棧”!)當然這種精簡是要以使用上的局限為代價的。
主要特性:
- 非常小的內存開銷 - 每個原始線程只有兩個字節,沒有多余的堆棧
- 高度便攜 - Protothreads庫是100%純C開發
- 可以在操作系統中使用或單獨使用
- 提供阻塞等待而不完整的多線程或堆棧切換 </ul>
#include "pt.h"struct pt pt; struct timer timer;
PT_THREAD(example(struct pt *pt)) { PT_BEGIN(pt);
while(1) { if(initiate_io()) { timer_start(&timer); PT_WAIT_UNTIL(pt, io_completed() || timer_expired(&timer)); read_data(); } } PT_END(pt); }</pre>
協程(coroutine)顧名思義就是“協作的例程”(co-operative routines)。跟具有操作系統概念的線程不一樣,協程是在用戶空間利用程序語言的語法語義就能實現邏輯上類似多任務的編程技巧。實際上協程的概念比線程還要早,按照 Knuth 的說法“子例程是協程的特例”,一個子例程就是一次子函數調用,那么實際上協程就是類函數一樣的程序組件,你可以在一個線程里面輕松創建數十萬個協程,就像數十萬次函數調用一樣。只不過子例程只有一個調用入口起始點,返回之后就結束了,而協程入口既可以是起始點,又可以從上一個返回點繼續執行,也就是說協程之間可以通過 yield 方式轉移執行權,對稱(symmetric)、平級地調用對方,而不是像例程那樣上下級調用關系。當然 Knuth 的“特例”指的是協程也可以模擬例程那樣實現上下級調用關系,這就叫非對稱協程(asymmetric coroutines)。
詳見:http://coolshell.cn/articles/10975.html