boost asio異步服務器(2)實現偽閉包延長連接生命周期

閉包

在函數內部實現一個子函數,子函數的作用域內能訪問外部函數的局部變量。閉包就是能夠讀取其他函數內部變量。但是由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成程的性能問題,可能導致內存泄露。

在上次的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.pswp.cn/bicheng/18268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18268.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

構造器--5.28

不用一個個屬性賦值的方法&#xff1a; 知道了類的創建與使用&#xff0c;但是每次賦值都是一個個調用&#xff0c;我們可以用構造器使得方法簡單一點&#xff0c;不用一個個調用屬性賦值&#xff0c;直接傳參就OK了&#xff1b; 點擊類名然后ctrl可以查看構造器 public yanxi…

C++完成特色旅游管理信息系統

背景&#xff1a; 繼C完成淄博燒烤節管理系統后&#xff0c;我們來到了特色旅游管理信息系統的代碼編寫&#xff0c;歷史鏈接點下方。 C完成淄博燒烤節管理系統_淄博燒烤總賬管理系統的-CSDN博客 問題描述&#xff1a; 為了更好的管理各個服務小組&#xff0c;開發相應的管…

民國漫畫雜志《時代漫畫》第30期.PDF

時代漫畫30.PDF: https://url03.ctfile.com/f/1779803-1248635414-87c8c8?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

webpack打包配置項

webpack打包配置項 在config.js 中 module.exports {publicPath: process.env.NODE_ENV production ? / : /, //靜態資源目錄outputDir: dist, //打包名稱assetsDir: static,//靜態資源&#xff0c;目錄devServer: {port: port,open: false,overlay: {warnings: false,erro…

SpringBoot自動裝配源碼

自動裝配&#xff1a; 實際上就是如何將Bean自動化裝載到IOC容器中管理&#xff0c;Springboot 的自動裝配時通過SPI 的方式來實現的 SPI&#xff1a;SpringBoot 定義的一套接口規范&#xff0c;這套規范規定&#xff1a;Springboot 在啟動時會掃描外部引用 jar 包中的META-IN…

css 漸變色邊框

效果圖&#xff1a; 代碼&#xff1a; <style>:root{--br-radius: 12px;}.list{position: relative;}.list_tle{margin-top: 15px;margin-bottom: 5px;}.item{position: relative;display: inline-flex;} .br1 {padding: 10px 16px;clip-path: inset(0 round 6px);borde…

官宣|HelpLook現已入駐釘釘應用市場,助力企業知識管理知識

前一陣子OpenAI公司最新的GPT-4o技術震撼發布&#xff0c;人工智能的實際應用前景再次引起行業矚目&#xff0c;或者被GPT4o的數據分析等特色功能折服。如您正尋求將AI技術融入企業知識管理&#xff0c;不要錯過HelpLook&#xff01;HelpLook AI知識庫已經正式入駐釘釘應用市場…

Flutter 中的 SlideTransition 小部件:全面指南

Flutter 中的 SlideTransition 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;SlideTransition 是一個動畫組件&#xff0c;用于創建滑動動畫效果&#xff0c;使得子組件可以沿著一個軸滑動進入或滑動退出視圖。這種動畫效果常用于頁面轉場、菜單展開收起、元素的添加…

2024-5-8——給植物澆水

2024-5-8 題目來源我的題解方法一 模擬 題目來源 力扣每日一題&#xff1b;題序&#xff1a;2079 我的題解 方法一 模擬 依次模擬澆水動作 使用一個變量 cap維護剩余的水量&#xff0c;使用t作為還未澆水的樹的下標。當從第 i?1株植物到達第 i株植物時&#xff1a; 如果 ca…

前端中css穿透樣式:deep的用法

在前端開發中&#xff0c;尤其是使用 Vue.js 這樣的框架時&#xff0c;有時我們需要在子組件中修改或影響由父組件傳遞下來的樣式。然而&#xff0c;由于組件的封裝和樣式隔離&#xff0c;直接修改子組件中的樣式可能不起作用。這時&#xff0c;我們可以使用 ::v-deep 偽元素來…

基于Android的家庭理財APP的設計與實現(論文+源碼)_kaic

摘 要 隨著我國居民收入和生活水平的提高&#xff0c;家庭理財成為人們熱議的焦點問題。在需求分析階段&#xff0c;系統從用戶的實際需求出發&#xff0c;確定了用戶賬戶管理、記賬、數據分析和提醒功能等幾個核心需求。用戶賬戶管理包括用戶注冊、登錄和密碼找回等基本操作…

【4th chapter】信息安全技術—安全技術、安全架構、安全策略、安全管理、軟件的脆弱性

概要 安全技術安全架構安全策略安全管理軟件的脆弱性加密技術&#xff08;Encryption Technology&#xff09;安全域架構&#xff08;Security Domain Architecture&#xff09;訪問控制策略&#xff08;Access Control Policy&#xff09;信息安全管理體系&#xff08;Inform…

面試數據庫八股文十問十答第六期

面試數據庫八股文十問十答第六期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01;關注專欄后就能收到持續更新&#xff01; ?點贊?收藏?不迷路&#xff01;? 1&#xff09;來說說一條 SQL 語句的執行…

leetcode題目238

除自身以外的數組的乘積 中等 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法&…

大數據技術Hbase列數據庫——topic1

目錄 搭建單機版Hbase驗證方法一驗證方法二 搭建單機版Hbase 驗證方法一 使用 jps 命令查看 HMaster 進程是否啟動 首先使用xftp 7上傳hbase-2.1.0安裝壓縮包到虛擬機進行解壓縮到某一地址&#xff0c;這里解壓縮到了上傳的路徑即/root/software/ tar -zxvf hbase-2.1.0-bi…

進程與線程學習

多線程 tthreading.Thread(targettask,arge(11,)) start&#xff08;&#xff09;開始 join&#xff08;&#xff09;等待 主線程在默認情況下會等待所有非守護線程&#xff08;子線程&#xff09;結束后才會結束程序。也就是說&#xff0c;如果主線程在結束前沒有調用所有…

2025第十屆美陳展

展位又遭瘋搶&#xff01;2025第十屆美陳展釋放“無界之美” 美是全球通用的語言&#xff0c;人類對美的追求始終如一&#xff0c;大眾審美在經歷了時代的變遷后開始趨同&#xff0c;東方文明深處的美學經濟開始崛起。 在如今商業邁入存量階段&#xff0c;以品牌為突破口打造…

基于 vuestic-ui 實戰教程 - 登錄篇

1. 簡介 登錄做為一個系統的門面&#xff0c;也是阻擋外界的一道防線&#xff0c;那在vuestic-ui中如何做登錄功能呢。在這里就之間沿用初始版本的Login頁面&#xff0c;作為一個演示模板&#xff0c;后續需要改進的讀者可以在此篇文章的基礎上修改。 2. 登錄接口相關api 與 t…

python連接mysql,并整理(去哪兒網)頁面數據到表

##引入requests/pymysql模塊 本地安裝mysql數據庫&#xff0c;安裝圖形化工具navicat import requests from pymysql import Connect#創建客戶端連接信息 client Connect(host127.0.0.1,port3306,userroot,password, ) #創建游標 cursor client.cursor() cursor.execute(cre…

17- PHP 開發-個人博客項目TP 框架路由訪問安全寫法歷史漏 洞

常見的php框架&#xff1a;laravel和thinkphp和yii 這里以thinkphp為例 thinkphp目錄訪問設置 這里只找到了這個3.多的源代碼&#xff0c;沒找點5.的&#xff0c;湊合一下 鏈接&#xff1a;GitHub - top-think/thinkphp: ThinkPHP3.2 ——基于PHP5的簡單快速的面向對象的PHP…