首页 > 编程语言 > 详细

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

时间:2018-09-22 13:58:00      阅读:171      评论:0      收藏:0      [点我收藏+]

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++协程的实现方式总结

原文:https://www.cnblogs.com/heluan/p/9689751.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!