Asio資料收集及使用點滴

2021-06-01 13:06:41 字數 2119 閱讀 2233

asio的架構:boost.asio 設計索引

概念性了解api:boost::asio中的同步與非同步

asio的buffer:buffer幾種用法,這些buffer都只是引用外部的記憶體資料,如果需要拷貝和分配,記得使用boost::pool,這裡還有一篇處理拷貝buffer的文章

例子解析:boost.asio的簡單使用(timer,thread,io_service類)

如果照著例子弄出的第乙個伺服器無法收到客戶端訊息,試試這個asio::async_read與socket的async_read_some的區別

這裡是另外乙個區別:boost.asio庫學習筆記—— receive和read的區別

std::string endpoint = socket.remote_endpoint( ).address( ).to_string();

以下是對這篇文章的翻譯:

asio chat_client.cpp中的一些問題

1. 有多少個執行緒在執行2個,還是3個?

>一般來說,依賴於執行的平台,從程式的角度來說是2個,包括:

*主線程,用於處理使用者的輸入輸出

*io_service.run()執行緒,用於處理chat_client物件中的所有行為(action)

還有,async_write會建立乙個執行緒或者其他的一些東西麼?

>不會.

2. 有關1的問題,為什麼write函式使用post直接呼叫?什麼不呼叫async_write?既然呼叫了post,你只是將其放到乙個佇列裡在同一執行緒處理,為什麼之後還要從其他執行緒呼叫async_write?

chat_client的成員物件不是執行緒安全的(故意?),因此要同步處理這些成員。如果直接從主線程呼叫async_write不是執行緒安全的,因為此時可能有後台執行緒正在訪問socket。

在這個例子中,所有的類成員都呼叫io_services.post()以保證在乙個執行緒裡訪問,達到執行緒安全。io_services保證任何使用io_services.post()(或io_servies.dispatch())傳入的控制代碼只會在io_serive.run()執行緒被呼叫。而且這個例子中只有乙個執行緒呼叫io_service.run(),所以chat_client的成員變數也只會在乙個執行緒中被訪問。

4. 如果我想傳送乙個連線事件到主線程,怎樣做?用io_service::post?能從主線程獲取io_services?

5. 為什麼在main函式的最後呼叫了t.join(),能用io_service.run()代替麼?

不行,請參考問題2的解答,那樣的話,執行緒安全將無法保證

6. 按照問題1的解答,如果有3個執行緒在執行(也就是,async_write被放到另外乙個執行緒),那麼哪個位置建立這個執行緒比較好?

因為主線程需要阻塞等待使用者資訊,因此io_service::run是唯一需要的。如果你的程式不需要這樣做,那麼就不需要其他執行緒,也就只需要簡單的呼叫io_service::run()就可以了,這也是大多數例子這樣做的原因

有關執行緒安全的問題

1. 對於asio物件,能從2個不同執行緒呼叫乙個共享物件的不同成員麼?

不能那麼其意義就是從2個不同執行緒訪問共享物件不是執行緒安全的?

是的只有被標記為 「共享物件:安全」的物件才能從不同執行緒同時訪問,io_service就是這樣的物件

2. 同樣是執行緒安全的問題,對於basic_deadline_timer::cancel()我需要用io_service.post(boost::bind(&deadline_timer::cancel, &mytimer))方法封裝呼叫麼?

是的,直接呼叫cancel()也不是執行緒安全的

最好的解決方法就是使用io_service::post()將所有的操作都放在乙個執行緒

3. asio有很多成員函式,我怎麼知道哪些能安全的呼叫?

一般情況下,你應該認為沒有任何乙個函式是安全的,以下是通用的io執行緒安全判斷用例:

write+write:不安全

read+write:不安全

read+read:安全

asio物件已經符合這種需求

使用asio庫封裝的UDP收發資料類

如何使用asio封裝的非同步處理udp資料的服務類?總結 平時工作中會經常用到udp收發資料,下面分享乙個常用的基於asio介面的簡單封裝 如下 示例 usdsocket.h ifndef udpsocket h define udpsocket h include include boost as...

Python資料收集及分析學習相關

資料分析基本的步驟可以分為 提出問題 匯入資料 資料清洗 構建模型 資料視覺化。python基礎 變數 字串 運算子 控制語句 迴圈 列表 元組 檔案i o 函式 異常 物件導向等 在如何建立物件即可停止python基礎學習,因為已經夠用了。建議可以去練習一些題目之類的鞏固自身 資料分析基礎工具 n...

網路收集Joomla 中文手冊及相關資料

手冊對應版本為 1.0.x,不過對應1.5來說變化不大。joomla 相關中文資料很少。將就用著吧。持續更新中。joomla 1.0.x 安裝手冊 簡體中文 joomla 1.0.x 安裝手冊 正體中文 joomla 1.0.x 基本管理手冊 正體中文 joomla 1.0.x 內容管理手冊 正體中...