读书人

ACE_Select_Reactor 一 入门

发布时间: 2012-08-25 10:06:20 作者: rapoo

ACE_Select_Reactor 1 ——入门

? ? ACE Reactor 框架实现了Reactor模式,允许事件驱动的应用对源自许多不同事件源的事件做出反映,比如IO句柄,定时器,以及信号,应用重新定义框架所定义的挂钩方法。框架随机对其进行分派来处理事件,Reactor负责:(1)检查多路分离器来自各种事件源的、不同类型的连接和数据事件,(2)将这些事件分派给应用所定义的处理器,由它进行处理。

? ? 反应式服务器响应来自一个或多个事件源的时间,在理想情况下,对时间的响应会足够快,以使所有请求看起来像是被同时处理的,尽管事件处理通常是由单个线程处理的。同步事件多路分离器位于各个反应式服务器的心脏处。这种机制检测源自许多事件源的事件并对其作出响应,从而同步地使事件作为服务器正常执行路径的一部分提供给服务器。

? ? select()函数是最为常见的同步事件多路分离器。这个系统函数在同一组IO句柄上等待指定的事件发生,当一个或者是多个IO句柄开始活动时,或是在指定的时间过去后,select函数就会返回。

? ? ACE_Select_Reactor是ACE_Reactor接口的一种实现,它使用select同步时间多路分离器函数来检测IO和定时器事件,除了支持ACE_Reactor接口的所有特性外,ACE_Select_Reactor类还提供了以下能力:

? ? 1、它支持重入的反应器调用,应用可以从正在由统一反应器分派的事件处理器中调用handle_event方法;

? ? 2、它可以被配置为同步化的或异步化的,在线程安全性和降低开销之间进行折中;

? ? 3、它在再次调用select函数之前,分派其句柄集中的所有活动句柄,从而保证了公正性。

?

?

#include "ace/streams.h"#include "ace/Reactor.h"#include "ace/Select_Reactor.h"#include "ace/Thread_Manager.h"#include <string>#include "Reactor_Logging_Server_T.h"#include "Logging_Acceptor_Ex.h"typedef Reactor_Logging_Server<Logging_Acceptor_Ex>        Server_Logging_Daemon;static ACE_THR_FUNC_RETURN event_loop (void *arg) {  ACE_Reactor *reactor = static_cast<ACE_Reactor *> (arg);  reactor->owner (ACE_OS::thr_self ());  reactor->run_reactor_event_loop ();  return 0;}static ACE_THR_FUNC_RETURN controller (void *arg) {  for (;;)   {    std::string user_input;    std::getline (cin, user_input, '\n');    if (user_input == "quit")     {      break;    }  }  return 0;}int main(int argc,char **argv){  ACE_Select_Reactor select_reactor;  ACE_Reactor reactor (&select_reactor);  Server_Logging_Daemon *server;  // Ignore argv[0]...  --argc; ++argv;  ACE_NEW_RETURN (server,                  Server_Logging_Daemon (argc, argv, &reactor),                  1);  ACE_Thread_Manager::instance ()->spawn (event_loop, &reactor);  ACE_Thread_Manager::instance ()->spawn (controller, &reactor);  return ACE_Thread_Manager::instance ()->wait ();}

? ? 在上面的代码中,在51行,由ACE_Thread_Manager单体派生一个线程,并让其运行event_loop()函数,在52行,由ACE_Thread_Manager单体派生一个线程,让其运行controller()函数。

? ? 在从main函数返回之前,等待其他两个线程推出,ACE_Thread_Manager:wait()还会收取两个线程的退出状态,以免内存泄漏。

读书人网 >编程

热点推荐