c++ uconcontext.h实现协程

c++ uconcontext.h实现协程

什么是协程?

协程是一种程序组件,是由子例程(过程、函数、例程、方法、子程序)的概念泛化而来的,子例程只有一个入口点且只返回一次,而协程允许多个入口点,可以在指定位置挂起和恢复执行。

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。

一个线程可以拥有多个协程,但是一个时刻只能有协程在执行,协程的调度是非强占式的,只有协程自己主动让出执行权才切换。而非像线程一样是由操作系统调度。

实现协程的重点就是保存当前上下文,切换到要执行的上下文,结束后再返回到保存的上下文

ucontext.h库

ucontext.h库中定义了一个ucontext_t结构体

typedef struct ucontext_t
  {
    unsigned long int __ctx(uc_flags);
    struct ucontext_t *uc_link; //后继上下文
    stack_t uc_stack;           //该上下文中使用的栈
    mcontext_t uc_mcontext;     
    sigset_t uc_sigmask;
    struct _libc_fpstate __fpregs_mem;
  } ucontext_t;

这个结构体是用来保存上下文的

并且定义了4个函数用于操作结构体

int getcontext(ucontext_t * ucp);
获取当前上下文, 初始化ucp结构体, 将当前上下文保存到ucp中
void makecontext(ucontext_t *ucp, void(*func)(), int argc, ...);
创建一个上下文
int setcontext(const ucontext_t *ucp);
设置当前的上下文为ucp
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
保存当前上下文至oucp, 激活ucp上下文

库的使用示例

#include<stdio.h>
#include<ucontext.h>

void funtion(){
    printf("run this\n");
}

int main()
{
    printf("in main\n");
    char stack[1024];
    ucontext_t main,other;
    getcontext(&main);   //获取当前上下文
    
    main.uc_stack.ss_sp = stack;          //指定栈空间
    main.uc_stack.ss_size = sizeof(stack);//指定栈空间大小
    main.uc_stack.ss_flags = 0;
    main.uc_link = &other;                //将后继上下文指向other

    makecontext(&main,funtion,0);         //为main指定要执行的函数
    
    swapcontext(&other,&main);            //激活main,并将当前上下文保存到other
    printf("in main\n");
    return 0;
}

output

in main
run this
in main

核心代码

ucontext_t main,other;
getcontext(&main);                    //获取当前上下文
main.uc_stack.ss_sp = stack;          //指定栈空间
main.uc_stack.ss_size = sizeof(stack);//指定栈空间大小
main.uc_stack.ss_flags = 0;
main.uc_link = &other;                //将后继上下文指向other
makecontext(&main,funtion,0);         //为main指定要执行的函数
swapcontext(&other,&main);            //激活main,并将当前上下文保存到other

代码地址

https://github.com/linzhongli/coroutine

全部评论

相关推荐

评论
点赞
2
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10315次浏览 92人参与
# 你的实习产出是真实的还是包装的? #
1836次浏览 42人参与
# 巨人网络春招 #
11320次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7537次浏览 43人参与
# 简历第一个项目做什么 #
31643次浏览 333人参与
# 重来一次,我还会选择这个专业吗 #
433423次浏览 3926人参与
# 米连集团26产品管培生项目 #
5892次浏览 215人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187071次浏览 1122人参与
# 牛客AI文生图 #
21418次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152338次浏览 887人参与
# 研究所笔面经互助 #
118892次浏览 577人参与
# 简历中的项目经历要怎么写? #
310182次浏览 4202人参与
# AI时代,哪些岗位最容易被淘汰 #
63576次浏览 813人参与
# 面试紧张时你会有什么表现? #
30502次浏览 188人参与
# 你今年的平均薪资是多少? #
213063次浏览 1039人参与
# 你怎么看待AI面试 #
179990次浏览 1245人参与
# 高学历就一定能找到好工作吗? #
64323次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76474次浏览 374人参与
# 我的求职精神状态 #
448028次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363346次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160627次浏览 1111人参与
# 校招笔试 #
470762次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务