用ucontext库创建简单的协程

简介: 用ucontext库创建简单的协程

1 协程介绍

协程是一种轻量级的线。协程在程序运行时由程序员显式控制调度的,可以在同一个线程中实现多个协程之间的切换,从而实现并发执行的效果。比较经典的理解是:“用同步的方法,做着异步的事情”。

协程避免了线程切换所带来的开销,在一些性能要求高、资源限制多的场合就特别的适用。

协程上下文ucontext_t,里面包含了程序计数器、栈指针、寄存器等信息,它们表示了一个协程的运行状态。通过ucontext_t的简单封装,即可验证 “保存和恢复上下文” 来实现协程的切换的过程。这些其实也是可以用汇编语言来实现的,但是不同的架构的CPU,都要用汇编各自实现一个版本。

2 用ucontext库创建简单的协程

linux上运行,简单的示例:

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

#define STACK_SIZE 10240

ucontext_t main_context, sub_context;

int count = 0;
void func1(){
   
   
    while(count ++ < 10){
   
   
        printf("func1 start \n");
        swapcontext(&sub_context, &main_context);
        printf("func1 end \n");
    }
}

void func2(){
   
   
    while(count ++ < 10) {
   
   
        printf("func2 start \n");
        swapcontext(&main_context, &sub_context);
        printf("func2 end \n");
    }
}


int main(int argc, char *argv[]) {
   
   
    char *stack = (char *)malloc(STACK_SIZE);
    getcontext(&sub_context);
    sub_context.uc_stack.ss_sp = stack;
    sub_context.uc_stack.ss_size = STACK_SIZE;
    sub_context.uc_link = &main_context;
    makecontext(&sub_context, func1, 0);

    func2();

    free(stack);
    return 0;
}

swapcontext 起到在两个函数中来回切换的作用,这

2.1 分析

在这里插入图片描述

2.2 实际输出

func2 start => 对应2.1 中的 1
func1 start => 对应2.1 中的 2
func2 end => 对应2.1 中的 3
func2 start => 对应2.1 中的 4 fun2执行 while循环,到达 func2 start
func1 end => 对应2.1 中的 5
func1 start => fun1执行 while循环,到达 func1 start
func2 end 。。。
func2 start
func1 end
func1 start
func2 end
func2 start
func1 end
func1 start
func2 end
func2 start
func1 end
func1 start
func2 end

PS: 这里只是简单的了解一下协程的概念,期待自己进一步深入学习,实现对网络IO收发的协程封装。
文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:链接

相关文章
|
网络协议 Unix Linux
有了协程库,开发DPDK应用程序第一次可以这么简单
使用PhotonLibOS协程库,以多执行单元并发的代码模型代替原先的异步回调模型,简化DPDK应用程序的开发。同时使用echo server验证了 用户态TCP/IP协议栈+轮询模式驱动 对比 内核原生协议栈+中断模式驱动 的性能优势
有了协程库,开发DPDK应用程序第一次可以这么简单
|
5天前
|
存储 Python
python使用gevent库来创建协程,并通过协程实现并发执行不同的任务
```markdown 这段Python代码利用`gevent`库实现并发执行协程。定义了两个打印函数`f1`和`f2`,分别输出&quot;csdn&quot;和&quot;yyds&quot;。代码首先创建列表`t_l`,并启动5个`f1`协程,将其加入列表并等待所有协程完成。随后,同样方式启动5个`f2`协程,存入`t1_l`列表并等待执行完毕。整体展示了`gevent`的协程并发操作。 ```
14 1
|
5天前
|
程序员 调度 数据库
Python中的异步编程:asyncio库和协程的深入解析
Python中的异步编程:asyncio库和协程的深入解析
|
11月前
|
JavaScript Linux 编译器
c++开源协程库libgo介绍及使用
c++开源协程库libgo介绍及使用
|
9月前
|
API Python
Gevent----非官方的python协程库
Gevent----非官方的python协程库
72 0
|
Python
Gevent 超好用的协程库!| Python 主题月
Gevent 超好用的协程库!| Python 主题月
163 0
|
NoSQL Redis
微信后台phxrpc协程库理解(提取协程相关源码)
微信后台phxrpc协程库理解(提取协程相关源码)
266 0
|
调度 C语言 C++
ucontext-人人都可以实现的简单协程库
1.干货写在前面 协程是一种用户态的轻量级线程。本篇主要研究协程的C/C++的实现。 首先我们可以看看有哪些语言已经具备协程语义: 比较重量级的有C#、erlang、golang* 轻量级有python、lua、javascript、ruby 还有函数式的scala、scheme等。 c/c++不直接支持协程语义,但有不少开源的协程库,如: Protothr
4906 1
|
5天前
|
网络协议 调度 开发者
python中gevent基于协程的并发编程模型详细介绍
`gevent`是Python的第三方库,提供基于协程的并发模型,适用于I/O密集型任务的高效异步编程。其核心是协程调度器,在单线程中轮流执行多个协程,通过非阻塞I/O实现高并发。主要特点包括协程调度、事件循环的I/O模型、同步/异步编程支持及易用性。示例代码展示了一个使用`gevent`实现的异步TCP服务器,当客户端连接时,服务器以协程方式处理请求,实现非阻塞通信。
17 0
|
5天前
|
数据采集 数据库 C++
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
23 0