标签:make 方式 convert cas else getc style switchto jmp
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() 删除纤程,如果删除当前纤程,会导致它所在的线程退出
标签:make 方式 convert cas else getc style switchto jmp
原文地址:https://www.cnblogs.com/heluan/p/9689751.html