天天看點

用ACE_TP_Reactor代替ACE_Select_Reactor

ACE_REACTOR提供了處理多個事件源消息的簡單架構,但是為此架構的default implementation 所寫的event_handler通常基于一個重要的assumption,那就是所有的event_handler事件處理函數都是串行地進入的。即,所有的event_handler事件處理函數都是不可重入的。這是因為架構的default implementation是單線程運作的。

ACE_TP_Reactor作為ACE_Reactor架構對Leader_follower(線程池模型之一)的支援,為架構提供了多線程并發運作的支援,應用使用這個Reactor實作,可以讓多個I/O操作并發進行,而發揮系統多路I/O,I/O與CPU獨立并行的能力,提高應用性能。

ACE_TP_Reactor為了可以讓原來運作在default reactor implementation 架構下的event_handler,可以直接放到TP_Reactor下去使用,對每一個I/O HANDLE做出了保護,當此handle正在被某個event_handler處理的時候,這個HANDLE會被挂起來,不再對此HANDLE做事件偵測,這樣就可以保證,同一個HANDLE上的所有事件是被多個線程順序串行地處理。

但是,在實際的應用中,(如下圖)通常同一個event_handler會處理多個事件源的消息,典型的是包括資料和控制消息,而資料和控制消息可能來自兩個不同的I/O HANDLE,甚至大多控制消息是直接來自應用内部/UI等非I/O HANDLE。這個時候ACE_TP_Reactor的同一個I/O HANDLE消息串行處理機制,就沒有辦法滿足這樣的event_handler了。

用ACE_TP_Reactor代替ACE_Select_Reactor

我們要做的就是利用ACE_Pipe和ACE_Message_Queue把所有的事件都排隊到同一個I/O HANDLE上去,再由ACE_TP_Reactor通過多個線程順序串行地觸發我們舊的event_handler來處理這些已經排好隊的事件/消息。

用ACE_TP_Reactor代替ACE_Select_Reactor

如圖,就是我們的政策,實際應用中,圖中的“事件排隊”和“Event_Handler”,一般都合并成為同一個事件排隊處理器對象。

繼續閱讀