日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

boost.asio系列——io_service

發(fā)布時間:2024/4/11 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boost.asio系列——io_service 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

IO模型

io_service對象是asio框架中的調(diào)度器,所有異步io事件都是通過它來分發(fā)處理的(io對象的構(gòu)造函數(shù)中都需要傳入一個io_service對象)。

????asio::io_service?io_service;
????asio::ip::tcp::socket?socket(
io_service);

在asio框架中,同步的io主要流程如下:

????

  • 應(yīng)用程序調(diào)用IO對象成員函數(shù)執(zhí)行IO操作
  • IO對象向io_service 提出請求.
  • io_service 調(diào)用操作系統(tǒng)的功能執(zhí)行連接操作.
  • 操作系統(tǒng)向io_service 返回執(zhí)行結(jié)果.
  • io_service將錯誤的操作結(jié)果翻譯為boost::system::error_code類型,再傳遞給IO對象.
  • 如果操作失敗,IO對象拋出boost::system::system_error類型的異常.
  • 而異步IO的處理流程則有些不同:

    ????

  • 應(yīng)用程序調(diào)用IO對象成員函數(shù)執(zhí)行IO操作
  • IO對象請求io_service的服務(wù)
  • io_service 通知操作系統(tǒng)其需要開始一個異步連接.
  • 操作系統(tǒng)指示連接操作完成, io_service從隊列中獲取操作結(jié)果
  • 應(yīng)用程序必須調(diào)用io_service::run()以便于接收結(jié)果
  • 調(diào)用io_service::run()后,io_service返回一個操作結(jié)果,并將其翻譯為error_code,傳遞到事件回調(diào)函數(shù)中
  • io_service對象

    io_service對象主要有兩個方法——post和run:

  • post用于發(fā)布io事件,如timer,socket讀寫等,一般由asio框架相應(yīng)對象調(diào)用,無需我們顯式調(diào)用。
  • run用于監(jiān)聽io事件響應(yīng),并執(zhí)行響應(yīng)回調(diào),對于異步io操作需要在代碼中顯式調(diào)用,對于同步io操作則由io對象隱式調(diào)用(并不是run函數(shù),不過也是等待io事件)。
  • 可見,io_service提供的是一個生產(chǎn)者消費者模型。在異步io操作中需要我們手動控制消費者,調(diào)用run函數(shù),它的基本工作模式如下:

  • 等待io事件響應(yīng),如果所有io事件響應(yīng)完成則退出
  • 等待到io事件響應(yīng)后,執(zhí)行其對應(yīng)的回調(diào)
  • 繼續(xù)等待下一個io事件,重復(fù)1-2
  • 從中可以看出,io_service是一個工作隊列的模型。在使用過程中一般有如下幾個需要注意的地方:

    1. run函數(shù)在io事件完成后會退出,導(dǎo)致后續(xù)基于該對象的異步io任務(wù)無法執(zhí)行

    由于io_service并不會主動常見調(diào)度線程,需要我們手動分配,常見的方式是給其分配一個線程,然后執(zhí)行run函數(shù)。但run函數(shù)在io事件完成后會退出,線程會終止,后續(xù)基于該對象的異步io任務(wù)無法得到調(diào)度。

    解決這個問題的方法是通過一個asio::io_service::work對象來守護io_service。這樣,即使所有io任務(wù)都執(zhí)行完成,也不會退出,繼續(xù)等待新的io任務(wù)。

    ????boost::asio::io_service?io;
    ????boost::asio::io_service::work?work(io);
    ????io.run();

    2. 回調(diào)在run函數(shù)的線程中同步執(zhí)行,當回調(diào)處理時間較長時阻塞后續(xù)io響應(yīng)

    解決這個問題的方法有兩種:1. 啟動多線程執(zhí)行run函數(shù)(run函數(shù)是線程安全的),2. 新啟動一個線程(或通過線程池)來執(zhí)行回調(diào)函數(shù)。一般來講,如果回調(diào)處理事件不是特別短,應(yīng)該使用在線程池中處理回調(diào)的方式。

    3. 回調(diào)在run函數(shù)的線程中同步執(zhí)行,io事件較多的時候得不到及時響應(yīng)

    這個其實是性能問題了,在多核cpu上可以通過在多個線程中執(zhí)行run函數(shù)來解決這一問題。這種方式也只能充分利用cpu性能,本身性能問題就不是光靠軟件就能解決的。

    .net中的異步io調(diào)度方式

    和io_service這種手動控制的方式比起來,.net則是純粹的自動檔了。IO調(diào)度由CLR托管了,無需手動控制?;卣{(diào)也是在線程池中執(zhí)行,無需擔心影響后續(xù)IO響應(yīng)。

    正是由于CLR的托管,在.net 的異步IO框架中,就沒有類似io_service的調(diào)度對象存在,這也符合.net的一貫簡潔做法。

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的boost.asio系列——io_service的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。