从应用层次探讨Reactor

操作系统已经提供了Reactor机制,核心表现是select方法。ACE的Reactor其实是对类select的操作系统方法的封装。   我这里都使用select方法举例讨论。   使用select方法,需要把socket压入FD_SET,使用select方法获取一次事件。在这个过程中,我们针对特定的事件进行反映,因此称为reactor。   ACE使用面对对象的思想对reactor进行了封装,对于一个事件句柄(Event_Handler)而言,它应该封装操作和数据(思考C++类的方法和数据),对于select方法而言,它接受socket句柄而不是Event_Handler,为了使用封装思想,应该在reactor中保存映射表,在register_hander时保存event_handler和socket的映射,把socket给select把event_handler给reactor。为了能够提取到event_handler中的socket handler,ACE规定了必须定义一个get_handle方法。   由以上分析得知,为了使用ACE::Reactor机制,我们应该继承ACE_Event_Handler,并且,get_handle方法是必须的,否则,Reactor无法获取handle注册,我们不能收到任何事件。   在register_handler时,需要通过特定的掩码注册特定事件,特定事件的方法应该被实现,当然,不实现也可以,只不过这样的话我们的event_handler没有任何使用意义。   额外收获,在实际使用Reactor框架进行网络编程的时候,周期性的时间事件往往对我们很有用(至少我经常用while-true-sleep方法为自己获得一个周期性的时间触发器),ACE的Reactor继承自ACE_Reactor_Timer_Interface类并实现了schedule_timer等方法,在我们的event_handler中,可以获得一次(注意是一次)到时通知(这相当于定了一个闹表),如果希望周期性获得通知,可以在每次到期的时候重新注册(重新定闹表)。   select方法可以获得一次事件,但实际使用中多数时候,我们需要使用select处理所有事件,这就需要使用循环处理select事件,Reactor理所当然的定义了run_reactor_event_loop系列方法。   在时间(ACE_Time_Value、ACE_Reactor_Timer_Interface)、事件(ACE_Event_Handler)、Reactor的支持下,我们可以高效的开发基于select的网络应用(对我来说,开发速度让我欣喜,当然,ACE的其他优点也很显著)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值