ACE_Reactor学习2 Reactor类API的功能分类

    昨天记录了Reactor.h中的API的主要分类, 按功能分为

    1. ACE对reactor提供了单件和普通实例两种方式

    2. ACE初始化, 配置函数

    3. 句柄管理功能

    4. 事件Loop功能

    5. Timer管理功能

    6. Single管理功能

    7. 通知机制

    8. 其他帮助函数

    下面详细的归类一下

    1. ACE对reactor提供了单件和普通实例两种方式

           Reactor类中的 ACE_Reactor *reactor_ 就是用来维护单件的, 但是提供了static的event_loop*一族函数, 并放在inl中, 现在还不清楚这些API有没有必要, 为什么不统一走非static的同名方法呢, 在实现上是没有什么区别, 只是为了调用的方便么, 个人认为如果是这样的原因, 就有点过了, 因为Reactor是一个用户API界面, 应该保持简单易用?  知道深层原因的大侠请拍砖

    2. ACE初始化

           在ACE_Reactor的构造函数ACE_Reactor (ACE_Reactor_Impl *impl =0,booldelete_implementation=false)中可以看出来, 在构造是, 用户可以指明该Reactor的底层实现方式, 如果用户不指定, 那么在构造函数中, 在win32平台下, 会自动指定ACE_Msg_WFMO_Reactor或者ACE_WFMO_Reactor作为默认的底层实现, 在其他平台中, 会指定ACE_TP_Reactor, ACE_Dev_Poll_Reactor, ACE_Select_Reactor作为默认的底层实现.

           底层实现由Reactor的成员变量ACE_Reactor_Impl *implementation_持有, 这个抽象类是pimp手法, 隔离了用户API界面和底层实现.

           值得注意的是 open( size_t max_number_of_handles, int restart = 0, ACE_Sig_Handler *signal_handler = 0, ACE_Timer_Queue *timer_queue = 0)这个函数, 是很有用了, 可以不调用, 因为在ACE_Reactor的构造函数中会用默认的参数先调用一次, 如果需要定制这些参数, 可以自己手动调用进行设置, 其中第二项是个有趣的参数, 如果不指定restart(即为0), 如果在select阻塞的过程中被信号中断, 那么事件Loop就会退出, 如果指定restart>0那么这种情况下就会重启select调用.

    3. 句柄管理功能

           包括register, remove,  suspend, resume句柄, 这里不但有IO事件句柄, 还可以有Single事件句柄, WIN32平台下有Event事件句柄

    4. 事件Loop功能

           包括事件主循环, 检测主循环结束, 停止主循环功能, handle_events, work_pending, 后两者的目地可能是为了给用户自己实现Loop提供的接口

    5. Timer管理功能

           Timer的功能来自于ACE_Reator的基类ACE_Reactor_Timer_Interface, 包含对时间事件的支持包括插入一个Timer, 返回唯一的TimerID, 重置一个Timer, 取消一个Timer等操作

    6. Single管理功能

           管理信号事件, linux下的信号, 和win下的event

    7. 通知机制

           notify函数很重要, 给外部提供了一种控制reactor的方法, 可以是唤醒正在阻塞的select, 也可以是投递一个用户自己指定的事件(把事件处理event_handle传进去), select_reactor中的实现是通过一个pipe

    8. 其他帮助函数

           find_handler, initialized(测试reactor是否成功init), owner(设置reactor的所有者线程), implementation(设置reactor的底层实现)等等

    ~~~ACE里面的东西太精巧了, 想一下子看明白, 真的是越看越多, 不免就转到细节里了, 这里先大概分个类, 对其中的每一条再细细的分析, 这样才能比较彻底的了解Reactor的实现原理.

附:

   ACE_Reactor的内存结构, 很简单的内存结构, sizeof可能是9 = 4 + 4 + 1(未对齐, 没测过, YY, 反正是为了表达它很小的意思)

           1.  一个vtab指针, 因为是继承了接口ACE_Reactor_Timer_Interface, 所以Reactor充当了事件事件的驱动者和管理者

           2. ACE_Reactor_Impl *implementation_ 指向底层reactor的实现

           3. bool delete_implementation_ ACE_Reactor在被析构时, 要不要把implementation_指向的也给析构掉, 注意, 默认参数是false, 但在用户不给定implementation_情况下这个值是true, 因为这时implementation_是ACE自己new出来的, 他就自己delete, 符合"谁new谁delete", 如果这个implementation_是一个非new出来的, 当然这个值就只能是false, 否者delete反而不对; 如果implementation_是用户自己new出来的, 那么最好在构造时指定这个参数为true, 否防止内存泄露.

原文地址:https://www.cnblogs.com/ringofthec/p/1687081.html