2017-07-24 33 views
0

我一直在閱讀boost asio文檔,具體是關於Proactor設計。io_service如何將完成事件與完成處理程序相匹配

,當我遇到這絲毫不差

前攝設計模式來:併發無緒

我有點不解的是,ASIO的用戶並不需要做的創建額外的線程異步IO作爲線程已經以這種模式中的異步操作處理器的形式佔上風。

所以只是爲了確認io_service對象是要作爲一個前攝(獲取完成事件,並分派到完成處理)

每當一個異步過程得到啓動它會通過一個後臺線程來照顧。

socket.async_connect(server_endpoint, your_completion_handler);

是下述順序是否正確?

1)連接操作將由線程處理。

2)Completion_handler將被推入某個隊列(或任何DS)?

3)async_connect完成後,結果/ Errorcode將被放置在完成事件隊列中。

4)前攝(io_service對象?)獲取完成事件將其映射到處理器

我只是想知道這是如何映射已經完成,由於異步操作處理器已經做出來的線程(沒有它?)任何先完成的事情都會觸發一個完成事件,以及如何知道應該爲這個事件調用哪個完成處理程序,以及該事件的哪一個完成處理程序(我認爲要研究實現中的哪一個),但對我而言,現在看起來有點沉重)

回答

1

io_service基本上是一個函數隊列。當你實例化socket時,你傳遞一個io_service的引用給它。現在,當你做電話:

socket.async_connect(server_endpoint, your_completion_handler); 

你開始一個異步操作,其中ASIO推同步功能io_service,這是你的函數隊列。 ASIO推送到io_service的功能包含您的處理程序。當時間到了時,io_service從隊列中彈出一個元素(一個函數)併爲您執行操作,最後用該操作的結果調用您的處理程序。

有關隊列的更多信息:如果在一個線程中啓動io_service對象(使用io_service::run()),那麼您將擁有一個真實的串行隊列,其中所有內容都按順序執行。另一方面,如果您在多個線程上調用io_service::run(),隊列將分佈在這些線程上。使用ASIO的strand可以實現非阻塞線程安全。

+0

我同意'strand',它使得完成事件隊列實際上使線程安全,當我們有多個proactors來監視一個完成事件。TBH'ASIO推送給io_service的函數包含你的處理程序'我有同樣的想法,根據已經說過的,我們只有一個隊列,它實際上是一個任務隊列,一旦線程彈出執行它的任務並將其稱爲這是另一個參數。是對的嗎? –

+0

@Explorer_N是的,一旦任務完成,相關的處理程序將被調用,這是一個參數。我重複了你所說的,因爲我想強調處理程序在任務完成後調用。 –

+0

你知道這只是一個想法,難道這似乎與這裏的圖表有所不同:http://www.boost.org/doc/libs/1_64_0/doc/html/booster_asio/overview/core/async。如果你看看他們,他們已經展示了一個名爲'Completion Event Queue'的單獨隊列,在這裏,處理器將監視一個事件並在將結果轉換爲適當的錯誤代碼後將其分派給處理程序,所以對我來說就像異步操作和處理程序已分離,並通過合適的派遣由一個proactor合併。 –

相關問題