C++协程
什么是协程
协程(Coroutine)是程序组件,可以在执行过程中暂停并在稍后继续执行。与传统的子例程(如函数或过程)不同,子例程一旦调用,必须等其返回后才能继续执行调用它的代码。协程则可以在执行过程中暂停,将控制权交还给调用者,并且可以在稍后从暂停的地方继续执行。
协程的关键特性包括:
- 可以在执行过程中暂停和恢复:这使得协程能够在需要的时候让出控制权,然后在适当的时候恢复执行。
- 保持状态:协程在暂停时会保存其当前的执行状态(包括局部变量和程序计数器),在恢复时可以从上次暂停的地方继续执行。
- 协同调度:协程由程序显式控制切换,通常不依赖于操作系统内核的调度器,减少了上下文切换的开销。
适用场景
协程特别适用于以下场景:
- I/O密集型任务:协程可以在等待I/O操作完成时暂停执行,而不阻塞线程,从而提高并发性能。
- 异步编程:协程使得异步编程更加直观和简洁,通过异步函数和等待机制,可以避免复杂的回调地狱。
- 生成器和迭代器:协程可以用来实现生成器,允许在迭代过程中产生值并在下次调用时继续执行。
- 协作式多任务:协程可以用于实现轻量级的任务调度,通过显式的控制切换,实现多任务的协作运行。
- 状态机:协程可以通过暂停和恢复的机制,自然地实现复杂的状态机逻辑。
C++中的协程
C++20标准引入了对协程的支持,使得开发者可以使用协程来简化异步编程和并发任务。C++协程的基本概念包括:
- 协程函数:以
co_return结束的函数,可以包含co_await表达式。 - 协程句柄:表示协程的当前状态,允许暂停和恢复执行。
- 承诺类型(Promise Type):定义了协程的行为,包括创建、暂停和恢复协程的方法。
示例代码
以下是一个使用C++20协程的简单示例:
#include <iostream>
#include <coroutine>
#include <thread>
#include <chrono>struct Timer {struct promise_type;using handle_type = std::coroutine_handle<promise_type>;struct promise_type {Timer get_return_object() { return {}; }std::suspend_always initial_suspend() { return {}; }std::suspend_always final_suspend() noexcept { return {}; }void return_void() {}void unhandled_exception() { std::terminate(); }};std::chrono::milliseconds duration;Timer(std::chrono::milliseconds duration) : duration(duration) {}bool await_ready() const { return false; }void await_suspend(std::coroutine_handle<> h) const {std::thread([h, duration = this->duration]() {std::this_thread::sleep_for(duration);h.resume();}).detach();}void await_resume() {}
};Timer sleep_for(std::chrono::milliseconds duration) {return Timer(duration);
}struct MyCoroutine {struct promise_type {MyCoroutine get_return_object() { return {}; }std::suspend_never initial_suspend() { return {}; }std::suspend_always final_suspend() noexcept { return {}; }void return_void() {}void unhandled_exception() { std::terminate(); }};
};MyCoroutine my_coroutine() {std::cout << "Hello, ";co_await sleep_for(std::chrono::seconds(1));std::cout << "World!" << std::endl;
}int main() {auto coroutine = my_coroutine();std::this_thread::sleep_for(std::chrono::seconds(2));return 0;
}
解释
- promise_type:定义协程的行为,包括初始挂起和最终挂起、返回值和异常处理。
- co_await:用于暂停协程的执行。
awaiter结构体定义了挂起和恢复协程的逻辑。 - resume:用于恢复协程的执行。
适用需求场景
- 网络编程:协程非常适合处理大量的并发连接,例如实现高性能的网络服务器。
- 实时系统:协程可以用于实现协作式调度,满足实时系统对低延迟和高响应性的需求。
- 游戏开发:游戏开发中的许多逻辑可以通过协程简化,例如处理动画、AI决策和物理模拟等。
- 文件和数据库I/O:任何需要异步处理文件I/O或数据库操作的场景,都可以通过协程来简化代码和提高性能。
- 并行计算:协程可以用于实现并行计算任务,例如数据处理和科学计算,充分利用多核处理器的能力。
通过使用协程,C++开发者可以编写更加简洁、高效的异步代码,同时减少上下文切换带来的开销,提升程序的并发性能。
相关文章:
C++协程
什么是协程 协程(Coroutine)是程序组件,可以在执行过程中暂停并在稍后继续执行。与传统的子例程(如函数或过程)不同,子例程一旦调用,必须等其返回后才能继续执行调用它的代码。协程则可以在执行…...
linux系统——ping命令
ping命令可以用来判断对远端ip的连通性,可以加域名也可以加公共ip地址 这里发送出56字节,返回64字节...
vue3第三十七节(自定义插件之自定义指令)防重指令
引言:自定义指令,我们可以通过插件的形式进行全局注册: 例如:在提交按钮请求接口时候,为了防止重复提交,而导致的请求资源浪费,或者是新增提交时候,防止新增相同的数据。 我们的全局…...
面试高频问题----5
一、线程池参数的执行顺序 1.如果线程池中的线程数量小于核心线程数,则创建新的线程来处理任务 2.如果线程池中的线程数量等于核心线程数,但工作队列未满,将任务放入工作队列中执行 3.如果工作队列已满,但线程数小于最大线程数…...
计算机网络 —— 网络层(子网掩码和子网划分)
计算机网络 —— 网络层(子网掩码和子网划分) 网络地址转换NAT子网掩码和子网划分举个例子第一步:看类型第二步:从主机号开始比对第三步:去头去尾 我们今天来看子网掩码和子网划分: 网络地址转换NAT 网络…...
2024 IDEA最新永久使用码教程(2099版)
本篇文章我就来分享一下2024年当前最新版 IntelliJ IDEA 最新注册码,教程如下,可免费永久,亲测有效,适合Windows和Mac。 本教程适用于 J B 全系列产品,包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、…...
http协议,tomcat的作用
HTTP 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 特点: 1.基于TCP协议:面向连接,安全 2. 基于请求-响应模型的:一次请求对应一次响应 3HTTP协议是无状态的协议:对于事务处理没有记忆能…...
有哪些针对平台端口的常见攻击手段
针对平台端口的攻击可以通过多种手段进行,这些手段涵盖了从扫描探测到利用漏洞入侵的整个过程。以下是一些常见的攻击手段及其简要描述: 端口扫描攻击: 攻击者使用端口扫描工具(如Nmap)探测目标系统开放的端口。通过分…...
Xcode下载安装
1.Xcode可用版本判断: 2.Xcode下载安装: 方案1:AppStore 下载更新 若方案1失败则 方案2:指定版本Xcode包下载解压安装 苹果下载 3.Xcode命令行工具插件安装 xcode-select --install 备注: xcode_x.x.x.xip(压缩包存在时效性(使用前24h/…...
【 k8s 标签与选择器 】
一、标签(Label) 用于给Kubernetes资源(如Pod、Service、Deployment等)打上自定义的键值对标识。以便更方便地管理和操作这些资源。 在各类资源的 metadata.labels 中进行配置。可以通过改配置文件的方式打标签。 apiVersion: v1…...
【模拟-BM99 顺时针旋转矩阵】
题目 BM99 顺时针旋转矩阵 描述 有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。 分析 模拟,写几个样例,分析一下新矩阵元素下标与原矩阵元素…...
今年618,京东和爱奇艺为大屏品质“把关”
今年618电视大战,还是打响了。 根据京东618数据显示,618开门红阶段热卖TOP10电视均为75英寸以上的大屏,拥有超高画质的MiniLED电视成交量同比增长5倍。可以看到,大屏电视逐步成为消费主流,尤其是拥有出色视听体验的高…...
NSS题目练习7
[MoeCTF 2022]baby_file 打开看见一串源代码,需要get传参传入file 题目提示php伪协议 用dirsearch扫描发现flag.php 用php伪协议查看,回显一串base64编码 解码后得到flag [鹤城杯 2021]Middle magic 读取这两个文件 一个php正则表达式 补充:…...
聊一聊大数据需求的流程
大致的流程:需求对接、口径梳理、数据开发、任务发布、任务监控、任务保障 流程图 startuml skinparam packageStyle rectangleactor 需求方 participant 数据BP as 数据组 participant 离线数仓 participant 实时数仓需求方 -> 数据组: 提出需求 数据组 -> …...
老黄一举揭秘三代GPU!打破摩尔定律,打造AI帝国,量产Blackwell解决ChatGPT全球耗电难题
近日,老黄手持Blackwell向全世界展示的那一刻,全场观众沸腾了。 这是迄今为止世界上最大的芯片! 用老黄的话来说,它是「全世界迄今为止制造出来的最复杂、性能最高的计算机。」GPT-4o深夜发布!Plus免费可用!…...
HTML静态网页成品作业(HTML+CSS)—— 家乡南宁介绍网页(2个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有2个页面。 二、作品演示 三、代…...
把qml程序制作成安装包(Windows)
先检查一下有没有安装Qt Installer FrameWork 需要用到Qt自带的打包工具: Qt Installer FrameWork,虽然有点拉胯,但是也能用用。一般放在Qt目录下的Tools文件夹下,如果没有看到,就去在线下载器去下载一下。 步骤1 随…...
内网中redis无法连接访问问题
这个错误信息说明 Redis 正在以受保护模式运行,这意味着它仅从本地回环接口(localhost 或 127.0.0.1)接受连接。如果你希望从外部计算机连接到 Redis,你需要采取一些措施来允许外部连接。 这里有一些解决方案: 禁用受…...
Unix环境高级编程第二版:深入探索与实战解析
Unix环境高级编程第二版:深入探索与实战解析 在信息化时代,Unix环境高级编程无疑是程序员们攀登技术高峰的必经之路。本文将针对《Unix环境高级编程第二版》一书,从四个方面、五个方面、六个方面和七个方面进行深入探讨,带您领略…...
SSL/TLS和HTTPS
HTTPS就是用了TLS包装的Socket进行通信的HTTP 混合加密 被称为混合加密。具体过程如下: 使用非对称加密协商对称密钥: 在通信的开始阶段,通常由客户端和服务器使用非对称加密算法(如RSA)来协商一个对称密钥。通常情…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
