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

c++ uconcontext.h实现协程的更多相关文章

  1. 协程coroutine

    协程(coroutine)顾名思义就是“协作的例程”(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程 ...

  2. 一个“蝇量级” C 语言协程库

    协程(coroutine)顾名思义就是“协作的例程”(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程 ...

  3. Python(八)进程、线程、协程篇

    本章内容: 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 线程 Threading用于提供线程相关的操作.线程是应用 ...

  4. Python-09-线程、进程、协程、异步IO

    0. 什么是线程(thread)? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆 ...

  5. python任务执行之线程,进程,与协程

    一.线程 线程为程序中执行任务的最小单元,由Threading模块提供了相关操作,线程适合于IO操作密集的情况下使用 #!/usr/bin/env python # -*- coding:utf-8 ...

  6. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  7. Python 线程、进程和协程

    python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...

  8. Python之路【第七篇续】:进程、线程、协程

    Socket Server模块 SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时 ...

  9. python成长之路 :线程、进程和协程

    python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...

随机推荐

  1. RocketMQ中Broker的启动源码分析(二)

    接着上一篇博客  [RocketMQ中Broker的启动源码分析(一)] 在完成准备工作后,调用start方法: public static BrokerController start(Broker ...

  2. OV SSL证书有哪些功能?网站安装OV SSL证书的好处

    OV SSL证书英文名称为Organization Validation SSL Certificate,申请OV SSL证书需要审核申请者对域名是否拥有控制权,同时审核申请者是否为一个合法登记.真实 ...

  3. Java——win10配置环境变量

    一.安装JDK 1.下载jdk                                           地址:https://pan.baidu.com/s/1P9CZZoZ0AzZU0c ...

  4. JVM调优之经验

    在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...

  5. String与new String()的区别

    JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池. String赋值的两种方式. 1.String str = "test"; 以这 ...

  6. Java学习|强引用,软引用,弱引用,幻想引用有什么区别?

    在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用:Java中根据其生命周期的长短,将引用分为4类. 1 强引用 特点:我们平常典型编码Object obj = new Objec ...

  7. 爱奇艺JAVA后台面经

    链接:https://www.nowcoder.com/discuss/217425 1.volatile关键字的含义 2.Java NIO 讲一下 2.1 NIO selector,epoll的区别 ...

  8. 逛公园[NOIP2017 D2 T3](dp+spfa)

    题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\)个点\(M\) 条边构成的有向图,且没有自环和重边.其中 1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条 ...

  9. Flutter学习笔记(17)--顶部导航TabBar、TabBarView、DefaultTabController

    如需转载,请注明出处:Flutter学习笔记(17)--顶部导航TabBar.TabBarView.DefaultTabController 上一篇我们说了BottmNavigationBar底部导航 ...

  10. 100天搞定机器学习|day38 反向传播算法推导

    往期回顾 100天搞定机器学习|(Day1-36) 100天搞定机器学习|Day37无公式理解反向传播算法之精髓 上集我们学习了反向传播算法的原理,今天我们深入讲解其中的微积分理论,展示在机器学习中, ...