boost asio异步服务器(2)实现伪闭包延长连接生命周期

news2024/11/19 7:50:29

闭包

在函数内部实现一个子函数,子函数的作用域内能访问外部函数的局部变量。闭包就是能够读取其他函数内部变量。但是由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成程的性能问题,可能导致内存泄露。

在上次的echo异步服务器中,在极端情况下客户端关闭导致触发写和读回调函数,二者都进入错误处理逻辑,进而造成二次析构的问题。

这里,使用C++11智能指针(引用计数的特性)构造成一个伪闭包的状态延长session的生命周期。

Server类改造

作为Server类,希望能够管理每一个生成的普通套接字,即管理每一个客户端连接的Session。所以在头文件中增加了一个map结构,key为唯一的uid,value则是交由智能指针管理的Session会话。

再改在Server类中的start_accept函数,将每次构造的新Session交由智能指针管理

在start_accept函数中绑定了handle_accept函数,所以这个函数也需要再改造一次

当调用start_accept函数的时候,就说明已经有新的连接到来了,这个时候需要将新的session添加到map中,供server管理。

session类改造

我们可以思考一下,当读写的时候,在触发读写回调函数的时候,session已经被释放,这样的情况是非常危险的。所以在绑定将session作为智能指针传递给回调函数,延长其生命周期。

在session类中,逻辑冲start函数中开始在绑定回调函数,该怎么将对象本身作为智能指针向下传递呢?

对象类必须继承一个模板类std::enable_shared_from_this<T>,这里的T就是类本身的类名,再继承这个模板类之后,提供有一个方法shared_from_this(),这个方法能将构造返回一个对象本身的智能指针。

至此,回调函数只用拿一个智能指针参数接收即可,若需要继续绑定其它回调函数,将这个智能指针参数继续向下传递即可。

二次析构测验

这里在读回调这里测验二次析构的问题,代码如下

具体操作是在异步写的地方打下断点,客户端连接之后立马断开,server端再继续向下执行,观察是否会发生内存崩溃的情况。

测试结果是不会发生内存崩溃的情况。

分析:这里使用shared_ptr的引用计数的策略延长对象的生命周期,实现伪闭包的效果。

再server类改造的时候,引用计数就为3。构造智能指针的时候,引用计数+1;绑定回调函数的时候,引用计数+1;加入map中,引用计数+1;所以session的引用计数至少为3,因为在session中,对应的session本身也在绑定回调函数的时候向下传递,引用计数也随之增加,离开对应作用域,引用计数也随之减少。当引用计数减至为0的时候,session的资源便会自动被释放了。

bind绑定函数的时候,会返回一个新的函数对象回来,所以在绑定函数的时候对应的智能指针的引用计数会+1。

也许上边智能指针的引用计数加减还会有疑惑,建议可以举一个客户端连接的实例分析,或者调断点打印智能指针的引用计数,观察效果。

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

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

相关文章

Discourse 使用 DiscourseConnect 来进行用户数据同步

我们都知道 Discourse 的用户管理和设置都高度依赖电子邮件。 如果 Discourse 没有设置电子邮件 SMTP 的话&#xff0c;作为管理员是没有办法对用户邮箱进行修改并且通过验证的。 可以采取的办法是通过 Discourse 的 DiscourseConnect 来进行用户同步。 根据官方的说法&…

Golang原生http实现中间件

Golang原生http实现中间件 中间件&#xff08;middleware&#xff09;&#xff1a;常被用来做认证校验、审计等 大家常用的Iris、Gin等web框架&#xff0c;都包含了中间件逻辑。但有时我们引入该框架显得较为繁重&#xff0c;本文将介绍通过golang原生http来实现中间件操作。全…

vue复习选择题2

1. 下面哪一个方法可以实现判断元素的class属性是否含有pp样式&#xff1f; &#xff08;A&#xff09; A. hasClass(“pp”)B. is(“pp”)C. attr(“class”,“pp”)D. toggleClass(“pp”) [!NOTE] 当涉及到在 jQuery 中判断元素的类属性时&#xff0c;下面是各个选项的作用…

2024/5/28 P1247 取火柴游戏

取火柴游戏 题目描述 输入 k k k 及 k k k 个整数 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1​,n2​,⋯,nk​&#xff0c;表示有 k k k 堆火柴棒&#xff0c;第 i i i 堆火柴棒的根数为 n i n_i ni​&#xff1b;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下&…

AI批量剪辑视频素材,高效混剪快速出片/矩阵发布,一键管理自媒体账号。

今天给大家分享一个超级好用的办公神器。特别是玩矩阵的企业&#xff0c;这款工具高效解决短视频剪辑问题。 这款软件可以帮你快速生产出1000条视频内容,而且还能把内容同步到多个平台账号上&#xff0c;多平台矩阵发布。 这款系统真的太棒了! 不仅操作简单,而且功能超强大。 …

干冰清洗机的清洗原理及应用

干冰清洗机的清洗原理及应用可以详细阐述如下&#xff1a; 一、清洗原理 干冰清洗机的清洗原理主要基于干冰的低温冷冻作用。干冰在常温下会迅速升华&#xff0c;吸收大量的热量&#xff0c;使周围的温度迅速降低。当干冰颗粒通过特殊的干冰清洗机喷射到清洗物体表面时&#…

Python | Leetcode Python题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution:def maxDepth(self, root: TreeNode) -> int:if not root: return 0queue, res [root], 0while queue:tmp []for node in queue:if node.left: tmp.append(node.left)if node.right: tmp.append(node.right)queue tmp…

素数判断的奥秘与编程实践

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、素数定义的深入理解 二、非素数的例子与思考 三、素数判断的编程实现 1. 穷举法判断素…

多语言印度红绿灯系统源码带三级分销代理功能

前端为2套UI&#xff0c;一套是html写的&#xff0c;一套是编译后的前端 后台功能很完善&#xff0c;带预设、首充返佣、三级分销机制、代理功能。 东西很简单&#xff0c;首页就是红绿灯的下注页面&#xff0c;玩法虽然单一&#xff0c;好在不残缺可以正常跑。

SD Flash介绍

作为一家专业生产存储芯片及存储卡的原厂&#xff0c;我们时常收到客户关于SD Flash的各种技术问题。MK米客方德将详细解答关于SD Flash的常见问题&#xff0c;助您更好地了解这一重要存储技术。 SD Flash是一种常见的存储卡技术&#xff0c;广泛应用于各种便携式设备中&#x…

无人机+EasyDSS互联网视频平台:构建秸秆焚烧监控的“天眼”系统

一、方案背景 在每年的夏收时节&#xff0c;秸秆禁烧成为各地政府面临的一项重要任务。随着夏收季节的结束&#xff0c;大量农作物秸秆的处理问题逐渐凸显。一方面农作物种植面积辽阔&#xff0c;禁烧区域面积较大&#xff0c;监管巡逻人员的数量有限&#xff0c;无法全面顾及…

微软提出“Copilot+ PCs”构想,强调本地AI处理;OpenAI暂停ChatGPT语音功能因声音相似争议

&#x1f989; AI新闻 &#x1f680; 微软提出“Copilot PCs”构想&#xff0c;强调本地AI处理 摘要&#xff1a;在微软 Build 开发者前瞻大会上&#xff0c;CEO 萨蒂亚・纳德拉介绍了“Copilot PCs”&#xff0c;一种新类 Windows PC&#xff0c;需配备神经处理单元&#xf…

centos7单机安装openstack

前提&#xff1a;如果你使用 VMware 一定要打开 虚拟化&#xff0c;点设置->处理器下面有一些选项&#xff0c;一定要勾选&#xff0c;如下图所示&#xff0c;勾选后&#xff0c;启动系统后使用lscpu查看 virtaulization 是否正确 1.更新yum源&#xff1a; #yum update2.关闭…

2024年,史上最强的数据库资料集合

&#x1f4a8;&#x1f3f9;&#x1f300; 2024年&#xff0c;史上最强的数据库资料集合 N种数据库的全方位整理&#xff1a; mysql&#xff0c;mariaDB&#xff0c;Percona Server&#xff0c;Redis&#xff0c;RocksDB&#xff0c;Cassandra&#xff0c;CouchDB&#xff0c…

【平渊随笔】我们为什么要复盘?吸取教训,予其惩,而毖后患!

《平渊》 肆 "予其惩&#xff0c;而毖后患" "复盘" 一词源于围棋术语&#xff0c;对弈者完成一局棋后&#xff0c;重新摆局&#xff0c;审视棋局中的优势与失误&#xff0c;看哪些地方下得好&#xff0c;哪些地方下得不好&#xff0c;有没有更优解&#xf…

(四)MySQL 事务

欢迎访问 事务有哪些特性&#xff1f; 事务是由 MySQL 的引擎来实现的&#xff0c;我们常见的 InnoDB 引擎它是支持事务的。 不过并不是所有的引擎都能支持事务&#xff0c;比如 MySQL 原生的 MyISAM 引擎就不支持事务&#xff0c;也正是这样&#xff0c;所以大多数 MySQL 的…

【Java EE】网络原理——HTTP请求

目录 1.认识URL 2.认识“方法&#xff08;method&#xff09;” 2.1GET方法 2.1.1使用Fiddler观察GET请求 2.1.2 GET请求的特点 2.2 POST方法 2.2.1 使用FIddler观察POST方法 2.2.2 POST请求的特点 3.认识请求“报头”&#xff08;header&#xff09; 3.1 Host 3.2 C…

力扣算法之1068. 产品销售分析 I

力扣传送门 题解 同时输出a,b两张表上的数据 我的解 SELECT product_name,year,price FROM Sales a LEFT JOIN Product b ON a.product_id b.product_id我的解注解 考sql联表语法

【软考】系统架构师知识点

目录 环路复杂度McCabe软件工具分类需求分类软件测试中间件分类等保&#xff08;信息安全等级保护&#xff09;数据流图DFD微内核架构信息系统生命周期区块链MDA模型驱动架构EJBSOA微服务REST五大原则管道过滤器 VS 仓库风格虚拟机风格质量属性 & 非功能性需求敏感点、权衡…

pdf编辑器推荐,这三款软件十分好用!

在数字化时代&#xff0c;PDF文档因其跨平台、易阅读的特性&#xff0c;成为了我们工作、学习、生活中不可或缺的一部分。然而&#xff0c;如何高效、便捷地编辑PDF文档&#xff0c;却成为许多人面临的难题。今天&#xff0c;就为大家推荐三款十分好用的PDF编辑器&#xff0c;让…