構建C協程之ucontext篇

2021-06-27 11:53:50 字數 1613 閱讀 1345

所謂 「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_tstack_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 的引用,...