ACE的反應器模型

2021-04-30 06:09:15 字數 1553 閱讀 2733

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...