1為什麼要反應器模型
前面的文章有個共同的特點,那就是針對一對一的通訊情況,甚至雙方通訊的先後都是定式的。對於要處理多個輸入輸出/網路連線,傳統的應用都要建立新的併發單元(程序或執行緒),每個輸入輸出/網路連線乙個併發單元。這可以很好的工作,但是帶來的執行時開銷也是很大的,在一些情況下,是無法接受的。同時,併發單元的管理控制使**變得異常複雜,如果駕駑的不夠火候,就會陷入災難之中。這種複雜已使很多人望而卻步。
反應器的基礎是使用select()、poll()、waitformultipleobjects()等系統函式做事件的多路分離。當乙個輸入輸出/網路連線口有事件發生時(可讀/可寫),反應器會呼叫相應的事件處理函式。
2反應器模型的實現
事件處理器(ace_reactor)通過事件迴圈(run_reactor_event_loop),對所有已註冊(register_handler)的事件處理器(ace_event_handler)進行檢測,當其中有事件處理器的控制代碼(get_handle)有事件發生時(可讀/可寫),呼叫該事件處理器相應的處理函式。類圖如下:
圖表 2-1
序列圖:
2.1 事件處理器
ace提供了事件處理器的基類:ace_event_handler。使用者(程式開發者)通過繼承該類,需要實現事件處理函式介面:
事件處理函式返回值的含義:
返回值
說明 -1
反應器刪除該事件登記,並呼叫 handle_close 函式 0
正常情況,反應器繼續分發事件
>0
讓反應器暫時不分發事件,繼續**該事件函式
2.2 反應器
使用者通過使用反應器的register_handler,把事件處理器登記到反應器中。在事件迴圈處理的時候,會對已登記的事件處理器進行事件探測,當有事件發生時,呼叫其相應的事件處理器。
事件註冊的乙個原型為:
register_handler ( ace_event_handler * event_handler, ace_reactor_mask mask)
event_handler為要註冊的事件處理器指標。mask為註冊的事件型別,參考如下:
事件 處理函式 說明
事件 處理函式
說明 ace_event_handler::read_mask
handle_input
當 io 口可讀時呼叫
ace_event_handler::write_mask
handle_output
當 io 可寫時呼叫
ace_event_handler::accept_mask
handle_input
對於服務端 socket ,當有客戶端連線時呼叫
反應器的另乙個應用是排程定時器,通過schedule_timer函式設定定時資訊,當定時事件到達,呼叫事件處理器的handle_timeout函式。
ACE反應器模型的應用 定時器
反應器的 schedule timer 函式用來設定乙個定時事件,當時間到達時 事件處理器的 handle timeout 處理函式。schedule timer 的原型如下 schedule timer ace event handler event handler,const void arg,...
ACE反應器 Reactor 模式 3
在伺服器端使用reactor框架 使用reactor框架的伺服器端結構如下 伺服器端註冊兩種事件處理器,clientacceptor和clientservice clientservice類負責和客戶端的通訊,每乙個clientservice物件對應乙個客戶端的socket連線。clientacce...
ACE反應器 Reactor 模式 4
定時器的實現 通過reactor機制,還可以很容易的實現定時器的功能,使用方式如下。編寫乙個事件反應器,過載 handle timeout 方法,該方法是定時器的觸發時間到時,會自動觸發該方法。通過reactor的 schedule timer 方法註冊定時器。啟動reacotr的 handle e...