C/C++協程的實現方式總結
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 <stdio.h> 2 #include <setjmp.h> 34 jmp_buf buf; 5 6 banana() 7 { 8 printf("in banana() \n"); 9 longjmp(buf,1); 10 printf("you‘ll never see this,because i longjmp‘d"); 11 } 12 13 main() 14 { 15 if(setjmp(buf)) 16 printf("back in main\n"); 17 else 18 { 19 printf("first time through\n"); 20 banana(); 21 } 22 }
打印結果:
first time through
in banana()
back in main
2、利用C語言語法switch-case的技巧來實現(Protothreads) 。
3、使用匯編代碼來切換上下文(實現c協程) 。
4、利用操作系統提供的接口:Linux的ucontext,Windows的Fiber。(雲風的coroutine)
ucontext: makecontext() 創建上下文
getcontext() 讀取上下文
setcontext() 設置上下文
swapcontext() 跳轉上下文
Fiber(纖程):ConverThreadToFiber() 從當前線程進入纖程
CreateFiber() 創建新纖程
SwitchToFiber() 切換到纖程
DeleteFiber() 刪除纖程,如果刪除當前纖程,會導致它所在的線程退出
C/C++協程的實現方式總結