实现一个协程

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;
}

参考

https://blog.csdn.net/qq910894904/article/details/41911175

上一篇下一篇

猜你喜欢

热点阅读