boost.asio系列——io_service
IO模型
io_service對(duì)象是asio框架中的調(diào)度器,所有異步io事件都是通過(guò)它來(lái)分發(fā)處理的(io對(duì)象的構(gòu)造函數(shù)中都需要傳入一個(gè)io_service對(duì)象)。
????asio::io_service?io_service;
????asio::ip::tcp::socket?socket(io_service);
在asio框架中,同步的io主要流程如下:
????
而異步IO的處理流程則有些不同:
????
io_service對(duì)象
io_service對(duì)象主要有兩個(gè)方法——post和run:
可見(jiàn),io_service提供的是一個(gè)生產(chǎn)者消費(fèi)者模型。在異步io操作中需要我們手動(dòng)控制消費(fèi)者,調(diào)用run函數(shù),它的基本工作模式如下:
從中可以看出,io_service是一個(gè)工作隊(duì)列的模型。在使用過(guò)程中一般有如下幾個(gè)需要注意的地方:
1. run函數(shù)在io事件完成后會(huì)退出,導(dǎo)致后續(xù)基于該對(duì)象的異步io任務(wù)無(wú)法執(zhí)行
由于io_service并不會(huì)主動(dòng)常見(jiàn)調(diào)度線(xiàn)程,需要我們手動(dòng)分配,常見(jiàn)的方式是給其分配一個(gè)線(xiàn)程,然后執(zhí)行run函數(shù)。但run函數(shù)在io事件完成后會(huì)退出,線(xiàn)程會(huì)終止,后續(xù)基于該對(duì)象的異步io任務(wù)無(wú)法得到調(diào)度。
解決這個(gè)問(wèn)題的方法是通過(guò)一個(gè)asio::io_service::work對(duì)象來(lái)守護(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ù)的線(xiàn)程中同步執(zhí)行,當(dāng)回調(diào)處理時(shí)間較長(zhǎng)時(shí)阻塞后續(xù)io響應(yīng)
解決這個(gè)問(wèn)題的方法有兩種:1. 啟動(dòng)多線(xiàn)程執(zhí)行run函數(shù)(run函數(shù)是線(xiàn)程安全的),2. 新啟動(dòng)一個(gè)線(xiàn)程(或通過(guò)線(xiàn)程池)來(lái)執(zhí)行回調(diào)函數(shù)。一般來(lái)講,如果回調(diào)處理事件不是特別短,應(yīng)該使用在線(xiàn)程池中處理回調(diào)的方式。
3. 回調(diào)在run函數(shù)的線(xiàn)程中同步執(zhí)行,io事件較多的時(shí)候得不到及時(shí)響應(yīng)
這個(gè)其實(shí)是性能問(wèn)題了,在多核cpu上可以通過(guò)在多個(gè)線(xiàn)程中執(zhí)行run函數(shù)來(lái)解決這一問(wèn)題。這種方式也只能充分利用cpu性能,本身性能問(wèn)題就不是光靠軟件就能解決的。
.net中的異步io調(diào)度方式
和io_service這種手動(dòng)控制的方式比起來(lái),.net則是純粹的自動(dòng)檔了。IO調(diào)度由CLR托管了,無(wú)需手動(dòng)控制。回調(diào)也是在線(xiàn)程池中執(zhí)行,無(wú)需擔(dān)心影響后續(xù)IO響應(yīng)。
正是由于CLR的托管,在.net 的異步IO框架中,就沒(méi)有類(lèi)似io_service的調(diào)度對(duì)象存在,這也符合.net的一貫簡(jiǎn)潔做法。
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪(fǎng):近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的boost.asio系列——io_service的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 内存管理:_CrtDumpMemoryL
- 下一篇: 在VC中如何找到崩溃的源头