c協程庫libco幾點體會

2022-03-24 23:12:28 字數 864 閱讀 6029

這裡說的是tencent開源的libco。

主要還是c/c++服務端,相比libevent,libco支援的平台有限。但是libco顯得更先進,可以寫「阻塞式**」,改造舊庫的時候甚至不需要改**。

libco是獨立的庫,沒有侵入性,能插入到幾乎所有**中使用。但是,libco需要執行乙個永久阻塞的函式,這意味著,libco是獨佔的,乙個系統執行緒內,不能有其他排程和阻塞函式,比如阻塞的網路函式,其他coroutine的類似實現,無限迴圈等。

看例子是最快最直觀的,官方庫上就有很多example。

libco需要通過co_yield_ct()等yield函式主動進行切換,切換出去的微執行緒,需要其他微執行緒co_resume才能執行,否則是不會被排程的。這個和goroutine不一樣。

libco的網路函式,會主動呼叫yield函式進行切換,然後由執行event_loop的微執行緒恢復,因此需要顯式地呼叫co_eventloop這個函式。

libco的棧可以是獨立的,也可以是共享的。

獨立的預先申請棧大小使用,注意棧的大小,通常比較小。

共享的先申請乙個大棧,然後libco切換的時候根據棧使用的大小拷貝到另乙個記憶體。因此最大值還是受到共享棧大小的影響。

libco的微執行緒資訊,保持乙個context上,這個context根據執行緒pid儲存在乙個全域性大陣列上。所以每乙個執行緒獨立排程下面的所有微執行緒。

所以每乙個系統執行緒,有網路收發的都需要呼叫co_eventloop。

獲得棧頂之後減去棧基。

//get curr stack sp

char c;

curr->stack_sp= &c;

int len = stack_mem->stack_bp - occupy_co->stack_sp;

libco原始碼閱讀(二) 協程關鍵資料結構

協程的建立和切換都是由使用者控制的,那麼協程切換時是如何儲存上下文資訊的呢,這一節我們介紹一下libco實現協程的關鍵資料結構。1 協程實體 stcoroutine t 2 協程上下文資訊 coctx t 3 私有棧和共享棧 stack mem stsharestack t 4 執行緒環境 stco...

malloc怎麼用 用C實現協程庫

協程這個東西有一段時間非常火熱,特別是go出來以後,大家都覺得這個使用者態執行緒技術解決了很多問題,甚至用它可以支撐8億使用者,於是大家紛紛寫了c c 的協程庫。實際上,我覺得協程庫和支撐多少使用者關係不大,甚至不用協程還可以支撐更多的使用者 減少了協程的開銷 協程只是提供一種程式設計模式,讓伺服器...

C 協程的用法。

協程 協同程式,在主程式執行的同時,開啟另外一段邏輯處理,來協同當前程式的執行,開啟協程的兩種方式 1 startcoroutine string methodname 注意 1 引數是方法名 字串型別 此方法可以包含乙個引數 2 形參方法可以有返回值 2 startcoroutine ienume...