欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

boost.asio框架系列之調(diào)度器io_service

 更新時間:2022年06月18日 15:34:04   作者:天方  
這篇文章介紹了boost.asio框架系列之調(diào)度器io_service,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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主要流程如下:

  • 應用程序調(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的處理流程則有些不同:

  • 應用程序調(diào)用IO對象成員函數(shù)執(zhí)行IO操作

  • IO對象請求io_service的服務

  • io_service 通知操作系統(tǒng)其需要開始一個異步連接.

  • 操作系統(tǒng)指示連接操作完成, io_service從隊列中獲取操作結(jié)果

  • 應用程序必須調(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框架相應對象調(diào)用,無需我們顯式調(diào)用。

  • run用于監(jiān)聽io事件響應,并執(zhí)行響應回調(diào),對于異步io操作需要在代碼中顯式調(diào)用,對于同步io操作則由io對象隱式調(diào)用(并不是run函數(shù),不過也是等待io事件)。

可見,io_service提供的是一個生產(chǎn)者消費者模型。在異步io操作中需要我們手動控制消費者,調(diào)用run函數(shù),它的基本工作模式如下:

  • 等待io事件響應,如果所有io事件響應完成則退出

  • 等待到io事件響應后,執(zhí)行其對應的回調(diào)

  • 繼續(xù)等待下一個io事件,重復1-2

從中可以看出,io_service是一個工作隊列的模型。在使用過程中一般有如下幾個需要注意的地方:

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

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

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

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

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

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

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

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

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

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

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

到此這篇關(guān)于boost.asio框架系列之調(diào)度器io_service的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言實現(xiàn)支持動態(tài)拓展和銷毀的線程池

    C語言實現(xiàn)支持動態(tài)拓展和銷毀的線程池

    這篇文章主要為大家介紹了C語言實現(xiàn)支持動態(tài)拓展和銷毀的線程池,感興趣的小伙伴們可以參考一下
    2016-01-01
  • C++詳解多線程中的線程同步與互斥量

    C++詳解多線程中的線程同步與互斥量

    線程間如何通信同步?一些伙伴好奇線程間的通信及同步方法,沒關(guān)系,下面小編就繼續(xù)給大家科普下線程間通信及同步的方法以及互斥量
    2022-05-05
  • CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟

    CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟

    本文主要介紹了CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • C++自帶的sort函數(shù)如何對vector容器元素進行排序

    C++自帶的sort函數(shù)如何對vector容器元素進行排序

    這篇文章主要介紹了C++自帶的sort函數(shù)如何對vector容器元素進行排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • C++中的memset用法詳解

    C++中的memset用法詳解

    memset是一個初始化函數(shù),作用是將某一塊內(nèi)存中的全部設(shè)置為指定的值,本文給大家介紹C++中的memset用法,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • C++大小字母的轉(zhuǎn)換方式

    C++大小字母的轉(zhuǎn)換方式

    這篇文章主要介紹了C++大小字母的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++設(shè)計模式之模板方法模式

    C++設(shè)計模式之模板方法模式

    這篇文章主要介紹了C++設(shè)計模式之模板方法模式,本文講解了什么是模板方法模式、模板方法模式的UML類圖、模板方法模式的使用場合等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Opencv實現(xiàn)視頻播放與進度控制

    Opencv實現(xiàn)視頻播放與進度控制

    這篇文章主要為大家詳細介紹了Opencv實現(xiàn)視頻播放與進度控制,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++中BitBlt的使用方法詳解

    C++中BitBlt的使用方法詳解

    這篇文章主要介紹了C++中BitBlt的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C++?TCP網(wǎng)絡(luò)編程詳細講解

    C++?TCP網(wǎng)絡(luò)編程詳細講解

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層
    2022-09-09

最新評論