2403C++,C++11玩转无栈协程

原文

C++11里也能玩无栈协程了?

答案是:可以!
事实上异网在很早时,C++11里就可用无栈协程异步代码了,只不过用起来不太方便,来看看C++11里怎么用异网无栈协程写一个回音服务器的吧.

#包含 <异网.h++>
#包含 <内存>
#包含 <向量>
#包含 <异网/产生.h++>
用 异网::异步写;
用 异网::缓冲;
用 异网::ip::传控;
用 异网::错误码;
用 大小型;
构 会话:异网::协程
{共针<传控::套接字>套接字_;共针<向量<>>缓冲_;会话(共针<传控::套接字> 套接字): 套接字_(套接字),缓冲_(新 向量<>(1024)){}空 符号()(错误码 ec = 错误码(), 大小型 n = 0){(!ec) 再入 (){(;;){产生 套接字_->异步读些(缓冲(*缓冲_), *); 产生 异步写(*套接字_, 缓冲(*缓冲_, n), *); }}}
};
构 服务器 : 异网::协程
{异网::io服务& io服务_;共针<传控::受者> 受者_;共针<传控::套接字> 套接字_;服务器(异网::io服务& io服务): io服务_(io服务),受者_(新 传控::受者(io服务, 传控::端点(传控::v4(), 54321))){}空 符号()(错误码 ec = 错误码()){再入 (){(;;){套接字_.重置(新 传控::套接字(io服务_));产生 受者_->异步接受(*套接字_, *);io服务_.提交(会话(套接字_));}}}
};
#包含 <异网/坚定.h++>
整 主()
{异网::io服务 io服务;io服务.提交(服务器(io服务));io服务.();
}

先看回声会话部分的代码:

  空 符号()(错误码 ec = 错误码(), 大小型 n = 0){(!ec) 再入 (){(;;){产生 套接字_->异步读些(缓冲(*缓冲_), *); 产生 异步写(*套接字_, 缓冲(*缓冲_, n), *); }}}
//其中(;;)
{产生 套接字_->异步读些(缓冲(*缓冲_), *); 产生 异步写(*套接字_, 缓冲(*缓冲_, n), *); 
} 

C++20协程代码是不是很像:

(;;)
{协待 套接字_->异步读些(缓冲(*缓冲_), 异网::用可等待); 协待 异步写(*套接字_, 缓冲(*缓冲_, n), 异网::用可等待); 
} 

所以C++11里面也是可通过协程来写异步代码的.
但是异网无栈协程实现比较简陋,使用起来有不少约束.首先要把用无栈协程文件两个头文件包装起来,因为内部是实现的,编译完之后需要解定义.

#包含 <异网/产生.h++>
#包含 <异网/坚定.h++>

第二个不便之处是不自由,使用协程的对象要从异网::协程继承,然后定义符号,注意该符号是怎么写的:

  空 符号()(错误码 ec = 错误码(), 大小型 n = 0){(!ec) 再入 (){(;;){产生 套接字_->异步读些(缓冲(*缓冲_), *); 产生 异步写(*套接字_, 缓冲(*缓冲_, n), *); }}}

相信你第一次看到该代码时会很懵,这是个啥意思,再入是什么鬼,看不懂该代码.不要着急,听我来给你解惑该符号.
参数错误码和传输大小,最开始时是默认的,为何这两个参数呢?注意函数中的再入(本),它表明当前该函数可重入的,则何时会重入呢?

每次产生返回时就重入了,产生之后ec大小就是新的了.比如产生 套接字_->异步读些(缓冲(*缓冲_),*本);
返回后,就可得到错误码和读到的大小了,所以完整写法应该是:

  空 符号()(错误码 ec = 错误码(), 大小型 n = 0){(!ec) 再入 (){(;;){产生 套接字_->异步读些(缓冲(*缓冲_), *);//协程重入(ec){输出<< "读错误消息: " << ec.消息() << "\n";;}输出 << "读大小: " << n << "\n";产生 异步写(*套接字_, 缓冲(*缓冲_, n), *); //协程重入(ec){输出<< "写错误消息: " << ec.消息() << "\n";;}输出<<"写大小:"<<n<<"\n";}}}

现在看懂了,该怪异写法了吧.
接着,如果想开启新协程要怎么做,看服务器接受的代码:

  空 符号()(错误码 ec = 错误码()){再入 (){(;;){套接字_.重置(新 传控::套接字(io服务_));产生 受者_->异步接受(*套接字_, *);io服务_.提交(会话(套接字_));}}}

产生受者_->异步接受(*套接字_,*本);之后通过提交,把会话对象丢到io环境线程池中了,后续会执行该会话对象,此时,你可能有疑问,为啥可把对象丢到线程池里?

答案很简单,因为会话符号它就成为一个函数对象了.

为什么这里要把会话函数对象丢到线程池里呢,为啥不继续产生呢?因为这里想立即再次接受而不是等待会话结束,如果产生 会话那就没办法继续接受了.
通过提交非阻塞方式调用会话的协程,两个协程不会相互阻塞.
除此外,异网还提供了另外一个创建子协程的方法:

空 服务器::符号()(异网::错误码 ec, 大小型 长度)
{(!ec){再入 (){{套接字_.重置(新 传控::套接字(受者_->取执行器()));产生 受者_->异步接受(*套接字_, *);分叉 服务器(*)();//`分叉`之后父子协程都会往下执行到此}(是父());产生 套接字_->异步读些(缓冲(*缓冲_), *); 产生 异步写(*套接字_, 缓冲(*缓冲_, n), *); }}
}

异网可通过分叉来创建子协程,分叉之后父协程和子协程都会往下执行,那如何区分父子协程呢?通过是父()来区分.

父协程是接受协程,当走到是父()时,它会继续接受,而子协程则会跳出循环,往下去了.

这就是通过分叉创建新协程的方法.

总结

异网里面有很多有趣的东西,以前还没注意C++11里用可无栈协程异步代码,也是其余远调用维护时想用协程去改造,然后发现了该东西,它已有很久的历史了,但我现在才注意到,确实能简化编写异步代码,后面C++11版本的其余远调用会使用异网无栈协程去写.

不过写法比使用C++20协程库麻烦多了,但是考虑毕竟是C++11,能用协程已不错了,如果能升级到20标准还是用20协程舒服.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++异常机制(5)-- 继承与异常

我们在c异常机制(3)中自定义类型&#xff0c;我们将相应的异常封装成了类&#xff0c;在类中实现一些方法&#xff0c;对异常进行处理。其中每一个类都实现了print()方法。 我们使用throw抛出相应异常的虚拟对象&#xff0c;在catch参数中进行匹配&#xff0c;但是如果有很多异…

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成&#xff08;无需引入第三方库&#xff09; 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版&#xff0c;获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

MATLAB环境下基于随机游走拉普拉斯算子的快速谱聚类方法

古人有云&#xff0c;物以类聚&#xff0c;在面临信息爆炸问题的今天&#xff0c;对信息类别划分的价值日益显现&#xff0c;并逐步成为学者们的研究热点。分类和聚类是数据挖掘的重要工具&#xff0c;是实现事物类别划分的左右手&#xff0c;聚类又是分类一种特殊的方式。所谓…

CodeWhisperer安装教导--一步到位!以及本人使用Whisperer的初体验。

CodeWhisperer是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和Github AWS CodeWhisperer 亚马逊科技的CodeWhisperer是Amazon于2021年12月推出的一款代码补全工具&#xff0c;与GitHub Copilot类似。主要的功能有:代码补全注释…

猫毛过敏养猫人士的必备养猫好物-宠物空气净化器品牌分享

许多猫奴在与猫相处一段时间后突然对猫毛过敏&#xff0c;这真是令人难受。一些人认为对猫咪过敏是因为它们在空气中飘浮的毛发引起的&#xff0c;但实际上大部分人之所以过敏是因为对猫身上一种微小的蛋白质过敏。这种导致过敏的蛋白质附着在猫咪的一些皮屑上。我们都知道猫咪…

前端架构: 脚手架通用框架封装之入口文件开发(教程一)

脚手架入口文件开发 创建脚手架项目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安装 lerna, $ npm i -g lerna 基于 lerna 完成项目初始化 $ lerna init 基于 lerna 创建脚手架 cli $ lerna create cli一路回车 好现在生成了一个 cli 的模板&#xff0c;目前需要…

Qt 中Json的构造和解析简单例子

概述: Qt中使用Json比较方便&#xff0c;不像纯C需要导入CJson RapidJson JsonCpp等第三方的库&#xff0c;主要使用到QJsonDocument、QJsonObject对象即可 1、如何构造一个json字符串 假如我们需要构造 {"cmd":"1001","data":{"content&q…

Linux 下安装Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动&#xff1a; python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…

高性能的key-value数据库Redis 介绍

Redis 是一个高性能的key-value数据库。 Redis是一个开源的键值存储系统&#xff0c;通常用于缓存和消息传递。它支持多种类型的数据结构&#xff0c;如字符串、列表、集合、散列表和有序集合等。Redis的特点是提供了高性能、灵活性和可伸缩性。 Redis的主要特点包括&#xff…

Pytorch学习 day02(加载数据)

加载数据 * Dataset提供一种方式&#xff1a;来获取数据及其label&#xff0c;给数据进行编号 * Dataloader为神经网络提供不同的数据形式 Dataset的组织形式有很多种&#xff0c;例如&#xff1a; 将label放在文件夹名上&#xff0c;如下&#xff1a; #Dateset # --train #…

Python算法题集_组合总和

Python算法题集_组合总和 题39&#xff1a;组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

.halo勒索病毒的最新威胁:如何恢复您的数据?

尊敬的读者&#xff1a; 随着科技的发展&#xff0c;网络安全已经成为我们日常生活中不可忽视的重要议题。其中&#xff0c;勒索病毒是当前网络安全威胁中的一大挑战&#xff0c;而“.halo”勒索病毒更是近期备受关注的恶意软件之一。本文将介绍关于“.halo”勒索病毒的背景知…

AI新工具(20240227) StickerBaker文本生成贴纸的工具;Mistral Large;Rewind等

StickerBaker - 基于Replicate和Fly.io技术&#xff0c;100%开源的制作贴纸的工具 StickerBaker是一个基于人工智能的贴纸创作工具&#xff0c;允许用户通过输入特定的提示语句生成独特的贴纸。这个工具使用了Replicate平台来生成贴纸&#xff0c;同时依托于Fly.io作为其基础设…

算法项目外包的收费方式

针对算法研究性项目的收费方式和注意事项&#xff0c;这取决于项目的具体性质、规模和所涉及的技术领域。以下是一些常见的收费方式和需要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 收…

Python学习DAY09_文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。 在 Python 中实现文件的读写操作其实非常简单&#xff0c;通过 Python 内置的 open 函数&#xff0c;我们可以指定文件名、操作模式、编码信…

1552.平衡二叉树

输入格式 第一行包含整数 N&#xff0c;表示总插入值数量。第二行包含 N 个不同的整数&#xff0c;表示每个插入值。 输出格式 输出得到的 AVL 树的根是多少。 数据范围 1≤N≤20 输入样例1&#xff1a; 5 88 70 61 96 120 输出样例1&#xff1a; 70 输入样例2&#xff1a…

商业江湖大揭秘:月入千万与颗粒无收,究竟差了什么?

在商业的浩瀚江湖 英雄豪杰们或乘风破浪、月入千万&#xff0c;或步履蹒跚、颗粒无收&#xff0c;这背后的奥秘究竟何在&#xff1f;是天意难测&#xff0c;还是人为疏忽&#xff1f;是制度的不完善&#xff0c;还是工具的滞后不前&#xff1f;答案就隐藏在你未曾注意的细节之…

公司招嵌入式开发岗位,为什么感觉一年比一年难?

最近看到一个问题&#xff1a; 是一个HR在吐槽招不到嵌入式开发的人才。 这句话&#xff0c;难免会误导一些想入行嵌入式的同学&#xff0c;卧槽&#xff0c;这么缺人?赶紧冲&#xff01; 哼次哼次学完一堆技术栈&#xff0c;一投简历&#xff0c;一个面试机会都没有。 这就是…

24路电磁锁主板在智能存储系统中的作用

在无人值守场景中&#xff0c;如自助服务机、智能生鲜柜、共享储物柜等&#xff0c;使用24路电磁锁主板可以集成身份识别技术&#xff0c;将用户的验证结果转化为相应的开锁动作&#xff0c;提升用户体验和运营效率&#xff0c;是实现智能存储系统高效、安全和自动化运行的关键…

Kubernetes的五大开源存储项目

在Kubernetes中&#xff0c;关于数据的持久化管理是一种挑战&#xff0c;对此&#xff0c;社区提供了多种存储的解决方案&#xff0c;这些方案旨在简化和优化容器化应用程序的持久化数据管理。 现介绍 Kubernetes 的五大开源存储项目&#xff0c;带你了解开源存储解决方案的多…