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

转载于:https://www.cnblogs.com/xcantaloupe/p/11102369.html

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
限时福利1:原价 129 元,最后2天仅需 69 元!后天涨价至98元 限时福利2:购课进答疑群专享柳峰(刘运强)老师答疑服务 限时福利3:购课添加助教领取价值 800 元的编大礼包 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是序员的必备技能,也是衡量一个序员能力和薪资的标准之一。 为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了「高性能 MySQL 知识框架图」,帮你梳理学习重点,建议收藏! 【课设计】 课分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。 二、MySQL 8.0新特性篇: 主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。 三、高性能架构篇: 主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。 四、面试篇: 序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合序员面试高频MySQL问题精讲精练,帮助序员吊打面试官,获得心仪的工作机会。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页