ACE網路開發中,各種Reactor實現的總結

2021-06-03 08:55:32 字數 1708 閱讀 8595

ace網路開發中,各種reactor實現的總結

現有的ace庫中提供了三種主要的reactor實現(更多新的實現到官方**上應該可以找到),ace_select_reactor, ace_tp_reactor和ace_wfmo_reactor。三種實現的使用都有不同的注意事項:

(1)ace_wfmo_reactor:這個實現是基於win32的socket event-select模型,也就是用乙個win32 的手動重置event與乙個socket相關聯(呼叫wsaeventselect函式並指明關心哪些socket事件,如可讀,可寫等),用waitformutiple0bjects來實現多路io監視,當這個函式返回後呼叫wsaenumnetworkevents檢查socket上發生了那種事件(可讀或可寫)。   這個實現問題最大。 首先,它的致命傷在於每乙個ace_wfmo_reactor只能同時監視64個socket(具體說是62個,有2個用於notify()和參與event-loop執行緒的喚醒同步);其次,就是它的可寫條件非常詭異,只有當socket內部寫緩衝區從滿到不滿時才算可寫,因此,向它register_event 寫事件時不出意外的話一定出錯(第一次寫成功,以後就再寫不了了)。因此,這個實現用途很有限。不過,這個實現可以保證多個執行緒同時對同乙個reactor執行event_loop,為了達到這個目的,它在多執行緒同步上下了很多任務夫,讀它的源**會是很好的學習機會(牛人寫的就是不一樣啊,win32 event的使用簡直是登峰造極)。

(3)ace_tp_reactor:這個是我最喜歡的了,但是如果不清楚它的實現的話會很容易出錯。如果你使用了多個執行緒run_reactor_event_loop:首先,在預設情況下,你不能象前兩個實現那樣在不需要某個handler的情況下安全的呼叫remove_handler();其次,你需要在handle_input(),和handle_timeout()以及handle_output(),和handle_timeout()中考慮同步,注意是handle_**put與handle_timeout()之間才有同步問題,而handle_input()和handle_output()之間不用考慮。解決第乙個問題的辦法是在ace_event_handler中啟動reference_count,並且改變刪除策略:在handle_close()中不進行任何清除工作,而是將ace_event_handler的reference_count減一,而清除工作應該在析構函式中進行。那麼,delete是誰呼叫呢---是reactor框架ace_event_handler在reference_count為0時幫你呼叫。總之,這個實現的使用要比其他的複雜。

總之,reactor的使用遠比那幾本書上講的要複雜得多,如果不徹底了解它是怎麼實現的,在使用過程中難免會碰到許多問題。所以,我的建議是,看源**!這樣不僅可以深入理解reactor框架,少犯錯誤,還可以學習大牛們怎麼寫程式的,特別是對於設計模式,還有作業系統api的靈活使用。關於ace_proactor的下次再聊。

提一些自己的看法,大家討論。

1、ace_wfmo_reactor部分,向它register_event 寫事件時不出意外的話一定出錯,應用中沒發現,因為這個實現中,事件在當前狀態變化時候觸發,而不是基於當前狀態觸發。所以,註冊了寫標誌後,你就一直傳送就行了,直到它告訴你不成了,再等待handle_output()被觸發。

2、ace_select_reactor部分,不過可惜的是只能乙個執行緒執行reactor_event_loop,這個不準確。準確的說,是在某一時刻只能被乙個執行緒執行。可以使用多個執行緒,但是每個執行緒迴圈中必須使用owner()方法設定所有者執行緒。

用ACE開發網路通訊程式

該程式將演示如何將乙個簡單結構序列化後傳送到網路上,如何從網路上接收到資料後反序列化回結構。首先使用ace sock connector connect連線某個伺服器 使用ip位址和埠號 該伺服器上使用ace sock acceptor accept等待外部的連線請求。ace inet addr類進...

用ACE開發網路通訊程式

該程式將演示如何將乙個簡單結構序列化後傳送到網路上,如何從網路上接收到資料後反序列化回結構。建立連線 首先使用ace sock connector connect連線某個伺服器 使用ip位址和埠號 該伺服器上使用ace sock acceptor accept等待外部的連線請求。ace inet a...

C 網路開發包ACE環境的配置與除錯

ace是個很有用的開放源 的c 網路程式設計開發包,利用它比直接用api更有利於 的健壯性,可移植性,並相對簡單。估計大家剛接觸ace時,都有一定難度,說不定就半途放棄了,這是我學ace兩天中的總結,基本上不成文,但我想研究到ace的你一定會明白下文的意思。我的系統環境是 win2k pro sp4...