1. 程式人生 > >C/C++協程的實現方式總結

C/C++協程的實現方式總結

創建 his pre dto spa -s pro 跳轉 保存

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>
 3
4 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++協程的實現方式總結