【并发编程二十】协程(coroutine)_协程库
【并发编程二十】协程(coroutine)
- 一、线程的缺点
- 二、协程
- 三、优点
- 四、个人理解
- 五、协程库
- 1、window系统
- 2、unix系统(包括linux的各个版本)
- 2.1、makecontext
- 2.2、swapcontext
- 2.3、setcontext
- 3、第三方库
- 3.1、Boost.Coroutine2
- 3.2、Boost.Context
- 3.3、libco
- 3.4、libgo
- 3.5、libaco
- 4、c++20
简介,
本文主要讲解协程的概念和对应的协程库。
一、线程的缺点
- 首先:线程分为用户线程和内核线程。(用户线程处于用户空间,内核线程处于内核空间)
- 其次:用户线程和内核线程可以是一对多或者一对一的关系。
- 再次:多线程编程时如果线程过多,会导致上下面的频繁切换,会有性能损耗。
二、协程
- 协程,可以被认为是在应用层模拟的线程。协程避免了线程上下面切换的部分额外损耗,同时具有并发运行的优点(本质上是串行执行),降低了编写并发程序的复杂度。
- 协程的概念早于线程提出,但它是非抢占式的调度,无法实现公平的任务调用,也无法直接利用多核cpu的优势。
- 操作系统的原生api并不支持协程。(但是我们可以利用操作系统提供的其他api达到协程类似的效果,比如Windows下的芊程,实现用户协程的效果)。
- 新生的一些高级语言,如golang都是在语言的运行环境中利用线程技术模拟了一套协程。
三、优点
-
对于线程,其切换是由操作系统根据其系统内核中的调度器,抢占式地进行的,不能很好地保证线程间的先后顺序;
-
协程可以理解为一种用户态的轻量级线程,切换由用户定义,各任务之间可以控制执行、暂停、恢复函数,来达到多任务协作的目的;
-
协程上下文切换速度快, 不会陷入内核态;
-
协程具有极高的执行效率,由于子程序切换不是线程切换,是由程序自身控制,故协程没有线程切换的开销
-
访问共享资源不需要使用多线程的锁机制和变量冲突,由于只有一个线程;
-
以同步代码的方式写异步逻辑;
四、个人理解
再此说下个人对协程的理解(非官方)
- 协程是语言级别的概念,线程是操作系统的概念。
- 协程可以理解为一个可以挂起和恢复的函数。
- 如果你这个可以挂起和恢复的函数推送到一个容器中,维护起来,就是协程池。
- 你挂起了,线程就可以切换、执行其他的协程逻辑,等你的协程中调用了恢复,我再来执行你的恢复后的逻辑。
五、协程库
1、window系统
- Fiber (芊程)
windows下提供的实现协程的方式。 - 参见我的上一篇博客【并发编程十九】芊程(fiber)
2、unix系统(包括linux的各个版本)
glibc是GNU发布的libc库
- ucontext
该库是在unix下提供的,使用是最安全可靠,但性能较差,大概200万次/秒- - 在<ucontext.h>中定义了两种数据类型:mcontext_t ,ucontext_t 以及四个函数:getcontext(), setcontext(), makecontext(3),swapcontext(3) 以实现用户级线程在其控制进程中进行上下文切换
typedef struct ucontext_t {struct ucontext_t *uc_link;sigset_t uc_sigmask;stack_t uc_stack;mcontext_t uc_mcontext;...
} ucontext_t;
2.1、makecontext
相当于windows系统下的芊程的CreateFiber
- 设置为入口函数的地址
void makecontext(ucontext_t *ucp, (void *func)(), int argc, ...); // https://pubs.opengroup.org/onlinepubs/7908799/xsh/makecontext.html
extern void makecontext (ucontext_t *__ucp, void (*__func) (void), int __argc, ...) __THROW; // from my pc
2.2、swapcontext
相当于windows系统下,芊程的SwitchToFiber
- 协程切换
int swapcontext(ucontext_t *restrict oucp, const ucontext_t *restrict ucp)
2.3、setcontext
恢复到ucp 指向的用户上下文(即开始执行执行的上下文), 成功调用不会返回。上下文应该是通过调用 getcontext() 或 makecontext(3) 创建的
int setcontext(const ucontext_t *ucp);
参考
linux手册翻译——getcontext(2) setcontext(2):https://www.jianshu.com/p/54f5c9fb53cf
ucontext的简单介绍:https://www.shuzhiduo.com/A/QV5Z09AVzy/
使用 setcontext 类函数实现 mini 协程库https://blog.csdn.net/liushengxi_root/article/details/85142236
3、第三方库
3.1、Boost.Coroutine2
Boost库也发布了Boost.Coroutine2协程库,其中包含了stackless和stackful两种协程的封装。(boost.coroutine已经废弃),
3.2、Boost.Context
Boost.Context这现有工具来辅助栈空间和运行状态的管理,ucontext算是历史比较悠久的,通过ucontext_t结构体保存栈信息、CPU执行上下文、信号掩码以及resume所需要的下一个ucontext_t结构的地址,但是人家实测ucontext的性能要比Boost.Context慢的多,Boost.Context是今年来C++各大协程底层支撑库的主流,性能一直在被优化。
性能佳,推荐使用,切换性能可达到1.25亿次/秒.(该说法未验证)
参考链接:
Boost.Context库简介及Boost.Coroutine协程使用方式https://juejin.cn/post/6844903790831730702
3.3、libco
- 官网mirrors / Tencent / libco
- 腾讯开源的一套c/c++版本的协程库。
- libco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上。
- libco通过仅有的几个函数接口 co_create/co_resume/co_yield 再配合 co_poll,可以支持同步或者异步的写法,如线程库一样轻松。同时库里面提供了socket族函数的hook,使得后台逻辑服务几乎不用修改逻辑代码就可以完成异步化改造。
3.4、libgo
- 官网:yyzybb537/libgo
libgo-- a coroutine library and a parallel Programming Library
Libgo is a stackful coroutine library for collaborative scheduling written in C++ 11, and it is also a powerful and easy-to-use parallel programming library.
Three platforms are currently supported:
Linux
MacOSX
Windows (Win7 or above,x86 or x64,complie with VS2015/2017)
3.5、libaco
- 官网:https://github.com/hnes/libaco
- libaco - A blazing fast and lightweight C asymmetric coroutine library.
- 轻量级 C 非对称协程库
中文解释:https://www.codingdict.com/os/software/48326
4、c++20
协程已经进入了c++20的标准,我们可以使用c++20的标准来实现协程了。具体使用我们下一篇文章介绍。
【并发编程二十一】c++20协程
参考:
1、《c++服务器开发精髓》张远龙 著
2、Linux【协程】 | 常见协程库简介https://blog.csdn.net/weixin_45926547/article/details/123482246
3、C/C++ 协程库boost.coroutine2、魅族libgo、腾讯libco、开源libaco详解https://blog.csdn.net/qq_23350817/article/details/116447916
4、什么是协程?https://blog.csdn.net/ThinPikachu/article/details/121325198
相关文章:
【并发编程二十】协程(coroutine)_协程库
【并发编程二十】协程(coroutine)一、线程的缺点二、协程三、优点四、个人理解五、协程库1、window系统2、unix系统(包括linux的各个版本)2.1、makecontext2.2、swapcontext2.3、setcontext3、第三方库3.1、Boost.Coroutine23.2、…...
c语言入门-5-字符串
c语言入门-5-字符串正文1、字符串怎么用方式一方式二2、字符串的长度深度解析1 字符串的特性2 \0 的含义3 ascii码表下一篇正文 1、字符串怎么用 方式一 // 字符串的标准使用方式,用char类型的数组表示字符串 #include<stdio.h> int main() {char arr[] &…...
[Ansible系列]ansible roles
目录 一. Roles简介 二. Roles基本构成 三. Role使用 3.1 playbook中引用roles 3.2 pre_tasks 和 post_tasks 3.3 role的依赖 四. Ansible Galaxy 一. Roles简介 在Ansible中,role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook…...
冯诺依曼体系结构与操作系统的理解
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:操作系统 💬<3>前言:今天来介绍一下冯诺依曼体系结构,和操作系统的理解。 目录 1.冯诺依曼体系结构 冯诺依曼体系的工作原理: 为…...
API接口签名验证
文章目录一、使用背景二、实现方案三、具体流程四、优化五、代码实现六、后续优化一、使用背景 过去对于接口的验证我一般都是直接在登录时为用户发放token,用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题,如果token被…...
Keettle (pdi-ce) 整库多表迁移(避坑)
使用开源免费 Keettle 工具 1.下载与安装 官网地址:下载 下载9.3.0以上的,6.1、7.1我都尝试过,6.1导致很多莫名其妙问题,7.1数据库可以连接和预览,迁移的时候就会出现事务读问题,最后解决这个问题后&…...
搭建私人《我的世界》服务器,使用Cpolar内网穿透更简单
文章目录1.前言2.本地服务器搭建2.1 设置环境变量2.2 进行《我的世界》服务器端设置2.3 测试和使用3.本地MC服务器的内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置3.3.测试和使用4.结语1.前言 要说去年游戏圈的重磅大瓜,想必网易和暴雪的分家必能上榜。虽然两家大…...
map和set的使用
文章目录关联式容器树形结构的关联式容器setinsert增减erase删除multiset修改mappair<key,value>insertoperator[] 的引入insert和operator[]的区别multimap小结map的使用统计最喜欢吃的前几种水果前K个高频单词,返回单词的频率由高到低,频率相同时࿰…...
常用正则表达式大全
链接...
注意,摸鱼程序员常用的9个小技巧,早点下班不秃头
9个养生小技巧,祝大家不秃头嗨害大家好鸭! 我是小熊猫~毕竟摸鱼一时爽,一直摸一直爽嘛~一、整理字符串输入二、迭代器切片(Slice)三、跳过可迭代对象的开头四、只包含关键字参数的函数 (kwargs)五、创建支持「with」语…...
【Linux】文件时间-ACM
文章目录文件时间-acmAccessChangeModify文件时间-acm 我们可以使用stat 文件名的方式查看对应的文件的时间信息 Access 表示文件最近一次被访问的时间 文件的访问 实际也就是文件的读取 实际操作中,文件的Access时间可能没有变化,这是因为在新的Linux内核中,Access时间不…...
[架构之路-124]-《软考-系统架构设计师》-操作系统-3-操作系统原理 - IO设备、微内核、嵌入式系统
第11章 操作系统第5节 设备管理/文件管理:IO5.1 文件管理5.2 IO设备管理(内存与IO设备之间)数据传输控制是指如何在内存和IO硬件设备之间传输数据,即:设备何时空闲?设备何时完成数据的传输?SPOO…...
【竞赛/TPU】算能TPU编程竞赛总结
如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【竞赛/TPU】算能TPU编程竞赛总结 1 基础知识 1.1【Ubuntu】 Ubuntu操作系统中有很多不同的文件夹,每个…...
Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点
三、模拟网络 本教程基本介绍了如何使用一个私有验证器(validators)的授权集合来启动私有区块链网络。 Substrate节点模板使用授权共识模型(authority consensus model),该模型将块生产限制为授权帐户的旋转列表(rotating list)。授权帐户(…...
SAP 设置无物料号的费用采购
现在还是以外购电来说一下ERP中费用采购单的使用步骤: (1).Tcode:OMSF定义物料组D1,如下图。 (2).到配置路径IMG Path:物料管理->采购->帐户分配(或直接SE16:V_T163K)定义一科目分配类别,默认的K就是费用采购科目分配类型,如果可能可以复制一个,如下图,注意下…...
k8s ConfigMap 中 subPath 字段和 items 字段
Kubernetes中什么是subPath 有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。 这句话理解了,基本就懂subPath怎么用了,比如我们要替换nginx.cnf, 挂…...
UML建模
主要记录UML中的相关知识,包括类、对象、接口、方法、用例、活动、状态、组件和部署图,详细介绍类之间关系与类图的绘制 文章目录一、UML介绍二、类图类之间的关系依赖关系继承关系实现关系关联关系组合关系聚合关系正文内容: 一、UML介绍 …...
JavaScript常见面试题(更新中)
介绍js的基本数据类型 js一共有五种数据类型 分别是undefined null boolean number string 还有ES6中新增的symbol和ES10的bigInt symbol代表创建后独一无二的不可变的数据类型,他的出现我认为是为了解决可能出现的全局变量冲突的问题 BigInt是一种数字类型的数据 …...
TCP/IP协议
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录TCP/IP协议应用层协议自定义应用层协议DNS传输层协议端口号UDP协议UDP协议端格式TCP协议TCP协议段格式TCP工作机制确认应答(安…...
Python使用异步线程池实现异步TCP服务器交互
背景: 实现客户端与服务端交互,由于效率原因,要发送与接收异步,提高效率。 需要多线程,本文用线程池管理。 common代码: import pickle import struct import timedef send_msg(conn, data):time.sleep(…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
