实现一个协程
2019-01-09 本文已影响0人
lixin_karl
一、头文件ucontext.h学习
posix中ucontext.h头文件可以帮助我们实现用户级别的线程:
int getcontext(ucontext_t *ucp)
将当前的上下文保存在ucp中。
int setcontext(const ucontext_t *ucp);
设置当前的上下文为ucp,如果上下文是通过调用getcontext()取得,程序会执行getcontext()下面跟着的调用。如果上下文是通过调用makecontext取得,程序会调用makecontext函数的第二个参数指向的函数,如果func函数返回,则继续执行则恢复makecontext中context_t中指向的uc_link.如果uc_link为NULL,则线程退出。
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
makecontext修改通过getcontext取得的上下文ucp(这意味着调用makecontext前必须先调用getcontext)。然后给该上下文指定一个栈空间ucp->stack,设置后继的上下文ucp->uc_link。
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
保存当前上下文到oucp结构体中,然后激活ucp上下文。如果执行成功,getcontext返回0,setcontext和swapcontext不返回;如果执行失败,getcontext,setcontext,swapcontext返回-1,并设置对于的errno。
#include<iostream>
#include<unistd.h>
#include<ucontext.h>
int main()
{
ucontext_t context;
getcontext(&context);
sleep(1);
std::cout<<"循环"<<std::endl;
setcontext(&context);
return 0;
}