最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

IO模型

io_service對象是asio框架中的調(diào)度器,所有異步io事件都是通過它來分發(fā)處理的(io對象的構(gòu)造函數(shù)中都需要傳入一個(gè)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將錯(cuò)誤的操作結(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)其需要開始一個(gè)異步連接.

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

  • 應(yīng)用程序必須調(diào)用io_service::run()以便于接收結(jié)果

  • 調(diào)用io_service::run()后,io_service返回一個(gè)操作結(jié)果,并將其翻譯為error_code,傳遞到事件回調(diào)函數(shù)中

io_service對象

io_service對象主要有兩個(gè)方法——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提供的是一個(gè)生產(chǎn)者消費(fèi)者模型。在異步io操作中需要我們手動(dòng)控制消費(fèi)者,調(diào)用run函數(shù),它的基本工作模式如下:

  • 等待io事件響應(yīng),如果所有io事件響應(yīng)完成則退出

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • opencv實(shí)現(xiàn)圖片與視頻中人臉檢測功能

    opencv實(shí)現(xiàn)圖片與視頻中人臉檢測功能

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖片與視頻中人臉檢測功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Cmake中強(qiáng)大的輸出函數(shù)message示例解析

    Cmake中強(qiáng)大的輸出函數(shù)message示例解析

    這篇文章主要介紹了Cmake中強(qiáng)大的輸出函數(shù)message解析,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • C語言UDP傳輸系統(tǒng)源碼

    C語言UDP傳輸系統(tǒng)源碼

    這篇文章主要為大家分享了C語言UDP傳輸系統(tǒng)的源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C語言實(shí)現(xiàn)拼圖游戲源碼

    C語言實(shí)現(xiàn)拼圖游戲源碼

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)拼圖游戲源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言實(shí)現(xiàn)程序開機(jī)自啟動(dòng)

    C語言實(shí)現(xiàn)程序開機(jī)自啟動(dòng)

    本文給大家分享的是一則C語言實(shí)現(xiàn)開機(jī)自啟動(dòng)的代碼,主要是通過C來獲取程序路徑修改注冊表項(xiàng)來實(shí)現(xiàn),有需要的小伙伴可以參考下
    2016-01-01
  • c++中ref的作用示例解析

    c++中ref的作用示例解析

    這篇文章主要為大家介紹了c++中ref的作用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C語言通過三步翻轉(zhuǎn)法實(shí)現(xiàn)單詞倒置詳解

    C語言通過三步翻轉(zhuǎn)法實(shí)現(xiàn)單詞倒置詳解

    這篇文章主要為大家分享了用三步翻轉(zhuǎn)法將一句話的單詞進(jìn)行倒置的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-05-05
  • C語言qsort函數(shù)用冒泡排序?qū)崿F(xiàn)過程詳解

    C語言qsort函數(shù)用冒泡排序?qū)崿F(xiàn)過程詳解

    qsort函數(shù)是由C語言提供的標(biāo)準(zhǔn)庫函數(shù), 它的實(shí)現(xiàn)思想是快速排序。這篇文章主要介紹了C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下
    2023-02-02
  • C語言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

    C語言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了C語言用封裝方法實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++?中如何結(jié)束?while?(cin>>str)?的輸入

    C++?中如何結(jié)束?while?(cin>>str)?的輸入

    這篇文章主要介紹了C++?中如何結(jié)束?while?(cin>>str)?的輸入,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

怀化市| 富宁县| 江城| 深州市| 荔浦县| 宿松县| 鄂托克旗| 新干县| 黎城县| 普安县| 长子县| 赫章县| 永川市| 旅游| 始兴县| 偏关县| 郎溪县| 清镇市| 万荣县| 东港市| 六安市| 江永县| 丰都县| 互助| 兴安盟| 龙泉市| 炎陵县| 中江县| 红原县| 莒南县| 如皋市| 启东市| 香格里拉县| 濮阳县| 阳东县| 山东省| 如皋市| 怀安县| 无极县| 太白县| 龙口市|