今天使用<ucontext.h>下的函数想试着搞一下协程。但是发现一个奇怪的现象。
#include<iostream>
#include<ucontext.h>
#include<unistd.h>
using namespace std;
void function(){
cout<<"run this"<<endl;
//sleep(1);
return;
}
void function2(){
cout<<"I am yuhaoxiao."<<endl;
return;
}
int main(){
cout<<"in main"<<endl;
char stack[1024],stack2[1024];
ucontext_t main,other,func;
getcontext(&main);
getcontext(&func);
func.uc_stack.ss_sp=stack2;
func.uc_stack.ss_size=sizeof(stack2);
func.uc_stack.ss_flags=0;
func.uc_link=&other;
makecontext(&func,function2,0);
main.uc_stack.ss_sp=stack;
main.uc_stack.ss_size=sizeof(stack);
main.uc_stack.ss_flags=0;
main.uc_link=&func;
makecontext(&main,function,0);
cout<<"test flag 1"<<endl;
swapcontext(&other,&main);
//setcontext(&main);
cout<<"in main"<<endl;
return 0;
}
调试代码如上。
在上述代码中,function()函数中带上sleep(1)后运行会出现segmentation fault,但是不带sleep(1)则可以运行成功。
想问一下各位大神是因为什么原因。
这个程序我编译运行没有segment fault.你那里是必现的吗?我将你贴上来的代码去掉函数function中的sleep注释,编译运行,没有问题。
g++ :g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
另外你这个程序有点乱,跳转不是很直观,程序中变量命名也有点随意,不能见名知意。
可以参考我收藏的一篇笔记,相对清晰一些。
协程-C语言实现
如果你发现有问题可以评论告知,我这里没运行出来segment fault.