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 34jmp_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...