C C 協程的實現方式總結

2022-08-02 09:36:12 字數 1256 閱讀 2923

1、利用 c 語言的 setjmp 和 longjmp,函式中使用 static local 的變數來儲存協程內部的資料。

函式原型:int setjmp(jmp_buf envbuf);

void longjmp(jmp_buf envbuf, int val);

先呼叫setjmp,用變數envbuf記錄當前的位置,然後呼叫longjmp,返回envbuf所記錄的位置,並使setjmp的返回值為val。使用longjmp後,envbuf的內容會被銷毀。

乙個例子(引自《c專家程式設計》):

1 #include 2 #include 3

4jmp_buf buf; 56

banana()7

1213

main() 14

22 }

列印結果:

first time through

in banana()

back in main

2、利用c語言語法switch-case的技巧來實現(protothreads) 。

設定乙個識別符號,改變識別符號的值,通過switch-case對識別符號值的判斷操縱各協程函式輪流執行。

每個協程函式可配乙個結構體,儲存棧內容和狀態機。

**:3、使用彙編**來切換上下文(實現c協程) 。

構建乙個結構體儲存棧內容和當前位置等上下文資訊,利用組合語言的跳轉實現協程功能。

詳情見:

4、利用作業系統提供的介面:linux的ucontext,windows的fiber。(雲風的coroutine)

ucontext:makecontext()       建立上下文      

getcontext()         讀取上下文

setcontext()         設定上下文

swapcontext()        跳轉上下文

fiber(纖程):converthreadtofiber()     從當前執行緒進入纖程

createfiber()         建立新纖程

switchtofiber()        切換到纖程

deletefiber()          刪除纖程

如果刪除當前纖程,會導致它所在的執行緒退出 

作業系統的介面函式本身,提供了儲存棧內容的功能。

一種協程的 C C 實現

在前幾天接觸到了協程的概念,覺得很有趣。因為我可以使用乙個執行緒來實現乙個類似多執行緒的程式,如果使用協程來替代執行緒,就可以省去很多原子操作和記憶體柵欄的麻煩,大大減少與執行緒同步相關的系統呼叫。因為我只有乙個執行緒,而且協程之間的切換是可以由函式自己決定的。我有見過幾種協程的實現,因為沒有 c ...

python 協程實現與總結

我要把5個任務放到乙個執行緒裡面去 能不能發生併發操作 又乙個程序,切換到另乙個程序,由誰來操作的儲存狀態,由作業系統來 單執行緒可以實現併發,用協程 要找到一種解決方案,讓程式設計師應用程式的角度,找到解決方案,能實現執行乙個任務,切換乙個任務,在切換到另乙個任務,在切換之前把狀態儲存下來 單執行...

gevent實現協程

1 yield實現 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield def main t1 task 1 建立迭代器 t...