用ACE_TP_Reactor代替ACE_Select_Reactor

来源:互联网 发布:加入淘宝客推广流程 编辑:程序博客网 时间:2024/04/30 12:02

ACE_REACTOR提供了处理多个事件源消息的简单框架,但是为此框架的default implementation 所写的event_handler通常基于一个重要的assumption,那就是所有的event_handler事件处理函数都是串行地进入的。即,所有的event_handler事件处理函数都是不可重入的。这是因为框架的default implementation是单线程运行的。

 

ACE_TP_Reactor作为ACE_Reactor框架对Leader_follower(线程池模型之一)的支持,为框架提供了多线程并发运行的支持,应用使用这个Reactor实现,可以让多个I/O操作并发进行,而发挥系统多路I/OI/OCPU独立并行的能力,提高应用性能。

 

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_PipeACE_Message_Queue把所有的事件都排队到同一个I/O HANDLE上去,再由ACE_TP_Reactor通过多个线程顺序串行地触发我们旧的event_handler来处理这些已经排好队的事件/消息。

 

 

如图,就是我们的策略,实际应用中,图中的“事件排队”和“Event_Handler”,一般都合并成为同一个事件排队处理器对象。

 
原创粉丝点击