C/C++协程的实现方式总结

Posted heluan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
 3  
 4 jmp_buf buf; 
 5 
 6 banana()
 7 { 
 8     printf("in banana() 
"); 
 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
"); 
17     else
18     { 
19         printf("first time through
"); 
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++协程的实现方式总结的主要内容,如果未能解决你的问题,请参考以下文章

Python协程与JavaScript协程的对比

什么是协程?

golang中四种方式实现子goroutine与主协程的同步

Python协程

谈谈我对 Kotlin 中协程的理解

协程的概念