当前位置: 首页 > news >正文

【并发编程二十】协程(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)_协程库

【并发编程二十】协程&#xff08;coroutine&#xff09;一、线程的缺点二、协程三、优点四、个人理解五、协程库1、window系统2、unix系统&#xff08;包括linux的各个版本&#xff09;2.1、makecontext2.2、swapcontext2.3、setcontext3、第三方库3.1、Boost.Coroutine23.2、…...

c语言入门-5-字符串

c语言入门-5-字符串正文1、字符串怎么用方式一方式二2、字符串的长度深度解析1 字符串的特性2 \0 的含义3 ascii码表下一篇正文 1、字符串怎么用 方式一 // 字符串的标准使用方式&#xff0c;用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中&#xff0c;role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook…...

冯诺依曼体系结构与操作系统的理解

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;操作系统 &#x1f4ac;<3>前言&#xff1a;今天来介绍一下冯诺依曼体系结构&#xff0c;和操作系统的理解。 目录 1.冯诺依曼体系结构 冯诺依曼体系的工作原理&#xff1a; 为…...

API接口签名验证

文章目录一、使用背景二、实现方案三、具体流程四、优化五、代码实现六、后续优化一、使用背景 过去对于接口的验证我一般都是直接在登录时为用户发放token&#xff0c;用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题&#xff0c;如果token被…...

Keettle (pdi-ce) 整库多表迁移(避坑)

使用开源免费 Keettle 工具 1.下载与安装 官网地址&#xff1a;下载 下载9.3.0以上的&#xff0c;6.1、7.1我都尝试过&#xff0c;6.1导致很多莫名其妙问题&#xff0c;7.1数据库可以连接和预览&#xff0c;迁移的时候就会出现事务读问题&#xff0c;最后解决这个问题后&…...

搭建私人《我的世界》服务器,使用Cpolar内网穿透更简单

文章目录1.前言2.本地服务器搭建2.1 设置环境变量2.2 进行《我的世界》服务器端设置2.3 测试和使用3.本地MC服务器的内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置3.3.测试和使用4.结语1.前言 要说去年游戏圈的重磅大瓜&#xff0c;想必网易和暴雪的分家必能上榜。虽然两家大…...

map和set的使用

文章目录关联式容器树形结构的关联式容器setinsert增减erase删除multiset修改mappair<key,value>insertoperator[] 的引入insert和operator[]的区别multimap小结map的使用统计最喜欢吃的前几种水果前K个高频单词&#xff0c;返回单词的频率由高到低,频率相同时&#xff0…...

常用正则表达式大全

链接...

注意,摸鱼程序员常用的9个小技巧,早点下班不秃头

9个养生小技巧&#xff0c;祝大家不秃头嗨害大家好鸭&#xff01; 我是小熊猫~毕竟摸鱼一时爽&#xff0c;一直摸一直爽嘛~一、整理字符串输入二、迭代器切片&#xff08;Slice&#xff09;三、跳过可迭代对象的开头四、只包含关键字参数的函数 (kwargs)五、创建支持「with」语…...

【Linux】文件时间-ACM

文章目录文件时间-acmAccessChangeModify文件时间-acm 我们可以使用stat 文件名的方式查看对应的文件的时间信息 Access 表示文件最近一次被访问的时间 文件的访问 实际也就是文件的读取 实际操作中,文件的Access时间可能没有变化,这是因为在新的Linux内核中,Access时间不…...

[架构之路-124]-《软考-系统架构设计师》-操作系统-3-操作系统原理 - IO设备、微内核、嵌入式系统

第11章 操作系统第5节 设备管理/文件管理&#xff1a;IO5.1 文件管理5.2 IO设备管理&#xff08;内存与IO设备之间&#xff09;数据传输控制是指如何在内存和IO硬件设备之间传输数据&#xff0c;即&#xff1a;设备何时空闲&#xff1f;设备何时完成数据的传输&#xff1f;SPOO…...

【竞赛/TPU】算能TPU编程竞赛总结

如果觉得我的分享有一定帮助&#xff0c;欢迎关注我的微信公众号 “码农的科研笔记”&#xff0c;了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【竞赛/TPU】算能TPU编程竞赛总结 1 基础知识 1.1【Ubuntu】 Ubuntu操作系统中有很多不同的文件夹&#xff0c;每个…...

Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点

三、模拟网络 本教程基本介绍了如何使用一个私有验证器&#xff08;validators&#xff09;的授权集合来启动私有区块链网络。 Substrate节点模板使用授权共识模型(authority consensus model)&#xff0c;该模型将块生产限制为授权帐户的旋转列表(rotating list)。授权帐户(…...

SAP 设置无物料号的费用采购

现在还是以外购电来说一下ERP中费用采购单的使用步骤&#xff1a; (1).Tcode:OMSF定义物料组D1,如下图。 (2).到配置路径IMG Path:物料管理->采购->帐户分配(或直接SE16:V_T163K)定义一科目分配类别,默认的K就是费用采购科目分配类型,如果可能可以复制一个,如下图,注意下…...

k8s ConfigMap 中 subPath 字段和 items 字段

Kubernetes中什么是subPath 有时&#xff0c;在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的子路径&#xff0c;而不是其根路径。 这句话理解了&#xff0c;基本就懂subPath怎么用了&#xff0c;比如我们要替换nginx.cnf, 挂…...

UML建模

主要记录UML中的相关知识&#xff0c;包括类、对象、接口、方法、用例、活动、状态、组件和部署图&#xff0c;详细介绍类之间关系与类图的绘制 文章目录一、UML介绍二、类图类之间的关系依赖关系继承关系实现关系关联关系组合关系聚合关系正文内容&#xff1a; 一、UML介绍 …...

JavaScript常见面试题(更新中)

介绍js的基本数据类型 js一共有五种数据类型 分别是undefined null boolean number string 还有ES6中新增的symbol和ES10的bigInt symbol代表创建后独一无二的不可变的数据类型&#xff0c;他的出现我认为是为了解决可能出现的全局变量冲突的问题 BigInt是一种数字类型的数据 …...

TCP/IP协议

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录TCP/IP协议应用层协议自定义应用层协议DNS传输层协议端口号UDP协议UDP协议端格式TCP协议TCP协议段格式TCP工作机制确认应答(安…...

Python使用异步线程池实现异步TCP服务器交互

背景&#xff1a; 实现客户端与服务端交互&#xff0c;由于效率原因&#xff0c;要发送与接收异步&#xff0c;提高效率。 需要多线程&#xff0c;本文用线程池管理。 common代码&#xff1a; import pickle import struct import timedef send_msg(conn, data):time.sleep(…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...