1. 程式人生 > >asio socket::close時非同步操作的處理

asio socket::close時非同步操作的處理

asio中socket通常的用法如

 

如果此時外界呼叫了Session::Close又刪除了該物件,已經由async_read註冊的HandleRead並不會被立即取消,而是會再次被呼叫,並把error_code設定成operation_aborted。那麼在HandleRead裡的delete this就會重複刪除物件造成崩潰。

如果把HandleRead改成

static void HandleRead(shared_ptr<Session> session, ...)

或者weak_ptr然後檢測是否已經expired,可以解決問題,但是由於智慧指標佔用空間比原生指標大,會在Read()中的boost::bind一句裡造成動態記憶體分配(

見此文),造成效率急劇下降。

最終的解決方案:手動去記錄有多少非同步操作被註冊,關閉socket時只有當計數減少到0才銷燬物件。

相關推薦

asio socket::close非同步操作處理

asio中socket通常的用法如 class Session { public: void HandleRead(const boost::system::error_code& error, size_t b

javaScript非同步操作處理

<!DOCTYPE html> <html lang="cn"> <head> <meta charset="UTF-8"> <title>Title</title> <script type=

ES6學習路上的小學生,promise處理非同步操作,簡易原始起步之用。先能用,再深究!

ES6的promise物件,讓我們更容易的處理這樣的需求:執行完一個方法以後,再去執行下一個方法。 理解尚淺之時,先用於專案之中。 1 var promise1 = new Promise(function(resolve, reject) { 2 //

處理分頁 當前頁>1操作的最後一頁的最後一條資料後,向前提前一頁

* handleAgentJobs({ payload }, { call, put }) { const data = yield call(handleAgentJob, payload) if (data && data.code === 200) { yiel

使用非同步操作的注意要點(翻譯)

非同步操作時應注意的要點 使用場景 非同步操作時需要注意的要點 1.使用非同步方法返回值應當避免使用void 在使用非同步方法中最好不要使用void當做返回值,無返回值也應使用Task作為返回值,因為使用void作為返回值具有以下缺點 無法得知非同步函式的狀態機在什麼時候執行完畢 如果非同步函式中出現

Amazon Comprehend 釋出非同步處理操作

我的同事 Jeff Barr 最近寫了一篇關於 Amazon Comprehend 的文章,這是一項用於發現文字中的見解和關係的服務,在 2017 年的 AWS re:Invent 大會上釋出。如今,在反覆研究客戶反饋之後,我們將釋出適用於 Comprehend 的全新非同步批量推理功能。非

C#多執行緒程式設計筆記(5.5)-處理非同步操作中的異常

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^本篇將描述在C#中使用非同步函式時如何處理異常。我們將學習對多個並行的非同步操作使用await時如何聚合異常。using System; using System.T

談一談幾種處理 JavaScript 非同步操作的辦法

寫於 2017.02.26 引言 js的非同步操作,已經是一個老生常談的話題,關於這個話題的文章隨便google一下都可以看到一大堆。那麼為什麼我還要寫這篇東西呢?在最近的工作中,為了編寫一套相對比較複雜的外掛,需要處理各種各樣的非同步操作。但是為了體積和相容性,不打算引入任何的pollyfil

【相容寫法】HttpServerUtility.Execute 在等待非同步操作完成被阻止。關鍵詞:MVC,分部檢視,非同步

MVC6之前的版本,對分部檢視的非同步支援不是很好 問題: 視圖裡面有分佈檢視:@{Html.RenderAction("NewProduct", "PartialView", new { count = 10 });} 後端採用非同步方法,比如: 其實MVC裡面的分佈檢視有兩種呼叫方法,

MySQL安裝-資料初始化操作的問題處理

1、資料初始化-主機名解析錯誤 系統-Red Hat Enterprise Linux Server release 6.6 軟體-原始碼安裝mysql-5.6.27.tar.gz 環境-Linux rhel6.myexample.com 2.6.32-504.el6.x8

最全面的Java字節byte操作,處理Java基本數據的轉換及進制轉換操作工具,流媒體及java底層開發項目常用工具類

進制 string 常用工具類 cat i++ logs 指定位置 tput off 前言:用於處理Java基本數據的轉換及進制轉換操作工具 一、實現功能 1、int預byte互轉 2、int與byte[]互轉 3、short與byte互轉 4、short與byte[]互轉

tomcat 服務不支持 chkconfig 以及其他服務不能添加到開機啟動操作

支持 bin 服務 啟動 tomcat chmod 報錯 但是 列表 在安裝完tomcat後想添加的開機自啟動的操作,但是報錯tomcat 服務不支持 chkconfig,後來在 /etc/init.d/tomcat中的#!/bin/bash後添加上#chkconfig:

關於easyui checkbox 的一些操作處理

get etc 選中 field ade row 是否 put easyui 1、獲取已勾選的行: var rows = $(‘#datagrid‘).datagrid(‘getChecked‘); 2、判斷checkbox是否全選: var allFlg = $(".da

golang中tcp socket粘包問題和處理

enc pack 獲取 人工 過程 reader 主動 exit ase 轉自:http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang開發人工客服系統的時候碰到了粘包問題,那麽什麽是粘包呢?例如我們和客戶端約定數據

創建持久性WMI事件0x8004100e錯誤處理

wmi在做持久性WMI事件的測試中,反復刪除WMI實例,後來遇到如下錯誤:Event filter with query "select * from DATABASE_MIRRORING_STATE_CHANGE" could not be reactivated in namespace "//./roo

[總結]Perl在遇到Unicode字符文件名的各種處理方法

ref 路徑 進行 foreach quest error 對象 odi base 環境 XP/WIN7 Perl v5.16 編輯整理:523066680 常見的那些文件操作函數都不支持,於是為了達到目的,需要各種方法配合,應該是不如其他語言方便。 我只是想看

IDEA無法啟用jdk配置操作

技術分享 分享圖片 http com img ima 直接 使用 分享 以上為報錯內容 在第一項可以看到配置jdk的空間 一般都有原來使用的jdk,可以直接選擇的。IDEA無法啟用jdk時配置操作

hadoop 3.1.1 單機集群配置/啟動問題的問題處理

mapr size iss specific onf keys property chm ctc 一.修改配置文件(hadoop目錄/etc/hadoop/配置文件) 1.修改hadoop-env.sh,指定JAVA_HOME 修改完畢後 2.修改core-site.x

數據操作處理(數組拼接,去重)

nbsp ret ldr code span children UNC 數據 push 1.數組處理添加與拼接           this.treeListData.push(res.payload.results.OADepartment);

socket程式設計select實現併發處理

//伺服器客戶端均已修改 //伺服器 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <