您的位置:首頁 > 教程 > C語言教程 > boost.asio框架系列之調度器io_service

boost.asio框架系列之調度器io_service

2022-06-18 17:52:43 來源:易采站長站 作者:

boost.asio框架系列之調度器io_service

IO模型

io_service對象是asio框架中的調度器,所有異步io事件都是通過它來分發處理的(io對象的構造函數中都需要傳入一個io_service對象)。ygU站長之家-易采站長站-Easck.Com

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

在asio框架中,同步的io主要流程如下:ygU站長之家-易采站長站-Easck.Com

ygU站長之家-易采站長站-Easck.Com

    應用程序調用IO對象成員函數執行IO操作ygU站長之家-易采站長站-Easck.Com

    IO對象向io_service 提出請求.ygU站長之家-易采站長站-Easck.Com

    io_service 調用操作系統的功能執行連接操作.ygU站長之家-易采站長站-Easck.Com

    操作系統向io_service 返回執行結果.ygU站長之家-易采站長站-Easck.Com

    io_service將錯誤的操作結果翻譯為boost::system::error_code類型,再傳遞給IO對象.ygU站長之家-易采站長站-Easck.Com

    如果操作失敗,IO對象拋出boost::system::system_error類型的異常.ygU站長之家-易采站長站-Easck.Com

    而異步IO的處理流程則有些不同:ygU站長之家-易采站長站-Easck.Com

    ygU站長之家-易采站長站-Easck.Com

      應用程序調用IO對象成員函數執行IO操作ygU站長之家-易采站長站-Easck.Com

      IO對象請求io_service的服務ygU站長之家-易采站長站-Easck.Com

      io_service 通知操作系統其需要開始一個異步連接.ygU站長之家-易采站長站-Easck.Com

      操作系統指示連接操作完成, io_service從隊列中獲取操作結果ygU站長之家-易采站長站-Easck.Com

      應用程序必須調用io_service::run()以便于接收結果ygU站長之家-易采站長站-Easck.Com

      調用io_service::run()后,io_service返回一個操作結果,并將其翻譯為error_code,傳遞到事件回調函數中ygU站長之家-易采站長站-Easck.Com

      io_service對象

      io_service對象主要有兩個方法——post和run:ygU站長之家-易采站長站-Easck.Com

        post用于發布io事件,如timer,socket讀寫等,一般由asio框架相應對象調用,無需我們顯式調用。ygU站長之家-易采站長站-Easck.Com

        run用于監聽io事件響應,并執行響應回調,對于異步io操作需要在代碼中顯式調用,對于同步io操作則由io對象隱式調用(并不是run函數,不過也是等待io事件)。ygU站長之家-易采站長站-Easck.Com

        可見,io_service提供的是一個生產者消費者模型。在異步io操作中需要我們手動控制消費者,調用run函數,它的基本工作模式如下:ygU站長之家-易采站長站-Easck.Com

          等待io事件響應,如果所有io事件響應完成則退出ygU站長之家-易采站長站-Easck.Com

          等待到io事件響應后,執行其對應的回調ygU站長之家-易采站長站-Easck.Com

          繼續等待下一個io事件,重復1-2ygU站長之家-易采站長站-Easck.Com

          從中可以看出,io_service是一個工作隊列的模型。在使用過程中一般有如下幾個需要注意的地方:ygU站長之家-易采站長站-Easck.Com

          1.>

          由于io_service并不會主動常見調度線程,需要我們手動分配,常見的方式是給其分配一個線程,然后執行run函數。但run函數在io事件完成后會退出,線程會終止,后續基于該對象的異步io任務無法得到調度。ygU站長之家-易采站長站-Easck.Com

          解決這個問題的方法是通過一個asio::io_service::work對象來守護io_service。這樣,即使所有io任務都執行完成,也不會退出,繼續等待新的io任務。ygU站長之家-易采站長站-Easck.Com

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

          2.>

          解決這個問題的方法有兩種:1. 啟動多線程執行run函數(run函數是線程安全的),2. 新啟動一個線程(或通過線程池)來執行回調函數。一般來講,如果回調處理事件不是特別短,應該使用在線程池中處理回調的方式。ygU站長之家-易采站長站-Easck.Com

          3.>

          這個其實是性能問題了,在多核cpu上可以通過在多個線程中執行run函數來解決這一問題。這種方式也只能充分利用cpu性能,本身性能問題就不是光靠軟件就能解決的。ygU站長之家-易采站長站-Easck.Com

          .net中的異步io調度方式

          和io_service這種手動控制的方式比起來,.net則是純粹的自動檔了。IO調度由CLR托管了,無需手動控制?;卣{也是在線程池中執行,無需擔心影響后續IO響應。ygU站長之家-易采站長站-Easck.Com

          正是由于CLR的托管,在.net>

          到此這篇關于boost.asio框架系列之調度器io_service的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持易采站長站。ygU站長之家-易采站長站-Easck.Com

          如有侵權,請聯系QQ:279390809 電話:15144810328

相關文章

  • VS2019項目打包生成.exe文件與Setup的步驟實現

    VS2019項目打包生成.exe文件與Setup的步驟實現

    對于Visual Studio Installer ,我們通常稱為:setup項目,是一個用于自定義安裝部署的項目方案。但是在VS2019中不見了,微軟是有意廢除安裝項目的,合作了一個第三方的安裝項目單獨使用。
    2020-03-13
  • 基于c++ ege圖形庫實現五子棋游戲

    基于c++ ege圖形庫實現五子棋游戲

    本文分享的五子棋實例,制作基于ege圖像庫, 首先需要安裝配置ege環境 就可以編寫小游戲了. 用到的ege庫函數不多 , 主要是基于c++的. 先看界面效果: 輸入界面:(就是控制臺) 游戲勝利界面
    2020-01-06
  • C++基于easyx圖形庫實現推箱子游戲

    C++基于easyx圖形庫實現推箱子游戲

    本文實例為大家分享了C++實現推箱子游戲的具體代碼,供大家參考,具體內容如下 頭文件: #includestdio.h#includestdlib.h//#includeWindows.h#includeconio.h#includegraphics.h#includestdbool.h //播放音樂需要
    2020-06-30
  • VS2019 Nuget找不到包的問題處理

    VS2019 Nuget找不到包的問題處理

    VS不記得改了什么設置之后,發現找不到EF 解決辦法 1、點擊右側的設置按鈕 2、彈出窗中左側樹形結構選擇“程序包源”,再點擊右上方的添加按鈕 輸入一下信息:https://www.nuget.org/a
    2020-03-27
  • visual studio2019的安裝以及使用圖文步驟詳解

    visual studio2019的安裝以及使用圖文步驟詳解

    一、下載安裝包 下載地址 選擇visual studio 2019的community版本 二、下載好后運行 三、組件的選擇 如果是用來學CC++的話,選擇以下兩個就夠了 之后如果還需要其他一些功能的話,可以后
    2020-03-08
  • VScode編譯C++ 頭文件顯示not found的問題

    VScode編譯C++ 頭文件顯示not found的問題

    一直用codeblocks,想試試vscode,結果這個問題給我弄懵逼了。一開始以為是iostream這個頭文件not found,后來發現第一個頭文件都會這樣顯示,放到后面就不會了,然而,光這一個顯示not
    2020-03-20
  • C++多線程獲取返回值方法詳解

    C++多線程獲取返回值方法詳解

    在許多時候,我們會有這樣的需求——即我們想要得到線程返回的值。但是在C++11 多線程中我們注意到,std::thread對象會忽略頂層函數的返回值。 那問題來了,我們要怎么獲得線程的返
    2020-06-25
  • JVM系列之String.intern的性能解析

    JVM系列之String.intern的性能解析

    String對象有個特殊的StringTable字符串常量池,為了減少Heap中生成的字符串的數量,推薦盡量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么樣呢?我們一起來
    2020-06-23
色七七影院_香港三级台湾三级在线播放_男人放进女人阳道猛进猛出