所謂 「ucontext」 機制是 gnu c 庫提供的一組用於建立、儲存、切換使用者態執行「上下文」(context)的api,可以看作是 「setjmp/long_jmp」 的「公升級版」,主要包括以下四個函式:
void
makecontext
(ucontext_t
*ucp
,void(*
func
)(),
intargc
,...);
intswapcontext
(ucontext_t
*oucp
,ucontext_t
*ucp
);int
getcontext
(ucontext_t
*ucp
);int
setcontext
(const
ucontext_t
*ucp
);
結構體ucontext_t
和上述4個函式宣告一起定義在系統標頭檔案中,該型別的具體實現與體系結構相關,但規範要求其至少要包含以下字段:
typedef
struct
ucontext
ucontext_t
;
其中sigset_t
和stack_t
定義在標準標頭檔案中,
uc_link
字段儲存當前context結束後繼續執行的context記錄,uc_sigmask
記錄該context執行階段需要遮蔽的訊號,uc_stack
是該context執行的棧資訊, 最後乙個字段uc_mcontext
則儲存具體的程式執行上下文——如pc值、堆疊指標、暫存器值等資訊——其實現方式依賴於底層執行的系統架構,是平台、硬體相關的。
下面具體來看每個函式的功能:
#include
#include
#include
intmain
(int
argc
,char
*argv
)
可以看出,用ucontext機制實現乙個「協程」系統並不困難。 實際上,每個執行上下文(ucontext_t)就直接對應於「協程」概念,對於協程的「建立」(create)、「啟動」 (spawn)、「掛起」 (suspend)、「切換」 (swap)等操作,很容易通過上面的4個api及其組合加以實現,需要的工作僅在於設計一組資料結構儲存暫不執行的context結構,提供一些排程的策略即可。 這方面的開源實現有很多,其中最著名的就是go的前身,libtask庫。
對於將「協程」對映到多os執行緒執行的情形,就要稍稍複雜一些,但主要的問題是集中在共享任務佇列的實現、排程執行緒間的互斥等,至於「協程」的對映問題,與單執行緒情況沒有太大的區別。 對於這方面的開源借鑑,當然首推go的執行時 —— 但由於標準go實現沒有使用gnu c庫,而是自行設計了包括c編譯器在內的整套工具鏈,因而就沒有直接採用ucontext機制(儘管其內部實現機制與ucontext原理類似)。
python 協程之特別篇
python通過yield提供了對協程的基本支援,但是不完全。而第三方的gevent為python提供了比較完善的協程支援。gevent是第三方庫,通過greenlet實現協程,其基本思想是 當乙個greenlet遇到io操作時,比如訪問網路,就自動切換到其他的greenlet,等到io操作完成,再...
C 網路程式設計之SOCKET應用篇
c 網路程式設計之socket應用篇 2010年06月22日 思想現代化的重要性 論程式設計的遞迴思想 談二叉樹的順序儲存與鏈式儲存結構。關於圖的概念,鄰接矩陣的理解。關於win7中top sites的立體感官。關於系統的設計精髓的討論 封裝思想,設計模式,stl泛型抽象結構化程式設計,以及哈夫曼樹...
Matlab混合程式設計之引擎方式(C 篇)
跟上篇文章一樣,也是用引擎的方式,但配置方法還是很不一樣的。配置環境 vs2013 64 位 matlab2013a 64 位 win8.1 64 位 以matlab 安裝路徑 c program files matlab r2013a 為例1.新增引用 乙個是新增 mwarray.dll 的引用,...