c 協程庫libfiber之1 簡單介紹

2021-10-24 13:50:31 字數 1375 閱讀 1732

我前一篇csdn部落格裡提到了libfiber這個協程庫,我真的覺得這個庫完成度很高,功能完善,文件詳細,而且是中國的公司(愛奇藝)維護的,可預見的時間內都會是活躍的專案,還經過了生產環境的檢驗。總之種種原因,讓我覺得這個專案還不錯。看了**後我更心動了。

協程除了可以提供更高併發的支援,還可以使用同步的方式寫非同步執行的**,使得**邏輯更加簡潔和清晰。

對應的還有一種stackless的協程,也就是共享棧的模式,這種模式下同樣物理記憶體可支援更多的協程(所以支援更高的併發),但是切換效率低一些。libco據說也支援的,我沒試過。

一般為乙個程協提供128k的棧空間,可以自己調大或調小。對libfiber來說,在128k模式下,1gb記憶體支援8192個協程,對於普通的業務,足夠了。

首先,libfiber的協程不能跨執行緒排程,這點和golang不太一樣。但是這樣的處理方式也更簡單,我個人不認為這是多大的缺點。況且libfiber實現了執行緒和協程的同步方式,「多執行緒+多協程」也不在話下。

其次,libfiber的協程切換不需要返回上一層,也就是說libfiber的協程是「對稱」的,沒有乙個中心化的排程協程,這樣排程起來效率更高。

下圖給出了採用 libfiber 編寫的回顯伺服器與採用其它網路協程庫編寫的回顯伺服器的效能對比(對比單核條件下的 io 處理能力):

看起來不錯!

channel

相當於乙個管道,最大容量100(可以自己修改**修改這個固定容量)。

應該只能用於同一執行緒裡的協程間通訊。

fiber_mutex

僅能用於同一執行緒內部的協程之間進行互斥的互斥鎖

fiber_event

可用於協程之間、執行緒之間以及協程與執行緒之間,通過事件等待/通知方式進行同步的事件混合鎖

fiber_cond

基於fiber_event,可用在協程之間,執行緒之間,協程與執行緒之間的條件變數

fiber_sem和fiber_sbox

fiber_sem是乙個協程間的訊號量。fiber_sbox是基於fiber_sem的乙個訊息管道。

感覺其作用類似於channel,但是未限制容量。

fiber_tbox

用於協程之間,執行緒之間以及協程與執行緒之間的訊息通訊,通過協程條件變數及協程事件鎖實現。

前面的channel和fiber_sbox都是用於同一執行緒裡的協程間通訊,這裡可以跨執行緒。

我前一篇csdn部落格:標準庫之外,那些通用的第三方的c-c++庫

libfiber的原始碼工程主頁:

libfiber的貢獻者愛奇藝的技術分享:愛奇藝網路協程編寫高併發應用實踐

acl作者介紹libfiber的部落格:acl開發–協程篇

c協程庫libco幾點體會

這裡說的是tencent開源的libco。主要還是c c 服務端,相比libevent,libco支援的平台有限。但是libco顯得更先進,可以寫 阻塞式 改造舊庫的時候甚至不需要改 libco是獨立的庫,沒有侵入性,能插入到幾乎所有 中使用。但是,libco需要執行乙個永久阻塞的函式,這意味著,l...

malloc怎麼用 用C實現協程庫

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

零基礎極簡C程設 1

簡述 c語言一般作為學習程式設計的第一門語言,適合與否也存在爭議,主流認為c語言和python最適合初學者。筆者認為python雖然容易做出東西,較有正向激勵的成就感,但c語言對計算機理解更有幫助。作為第一門語言最大問題在於入門難,定義類內容繁雜,學習時找不到正確的道路使得萌新苦不堪言,因此以筆者的...