7.5 有效使用反应堆的设计准则

原创 2006年05月29日 20:47:00

7.5 有效使用反应堆的设计准则

  ACE_Reactor是事件多路分离和事件处理器分派的强大构架。但是,像其他构架一样,学习使用ACE_Reactor需要时间和努力。缩短学习曲线的的一种途径是去理解有效使用反应堆所必须遵从的设计准则。下面描述的设计准则基于帮助ACE用户正确进行反应堆构架编程所获得的大量经验。

设计准则0:不要手工删除事件处理器对象或显式调用handle_close棗相反,确保ACE_Reactor自动调用handle_close清扫方法。因而,应用必须遵从适当的协议来移除事件处理器,也就是,或者通过(1)从handle_* 挂钩方法中返回负值,或者通过(2)调用remove_handler

该设计准则确保ACE_Reactor能够适当地清扫它的内部表。如果不服从这一准则,当ACE_Reactor试图移除已经在外部被删除的具体事件处理器时,就会带来不可预测的内存管理问题。后面的设计准则详细说明怎样确保ACE_Reactor调用handle_close清扫方法。

 

设计准则1:从继承自ACE_Event_Handler的类的handle_* 方法中返回的表达式必须是常量(constant。这一设计准则有助于静态地检查是否handle_* 方法返回了恰当的值。如果必须违反此准则,开发者必须在return语句之前加一注释,解释为何要使用变量,而不是常量。

设计准则2:如果从继承自ACE_Event_Handler的类的handle_* 方法中返回的值不为0,必须在return语句之前加一注释,说明该返回值的含义。这一设计准则确保所有非0的返回值都是开发者有意使用的。

设计准则3当你想要触发具体事件处理器的相应handle_close清扫方法时,从handle_* 方法中返回一个负值。值-1通常用于触发清扫挂钩,因为它是ACE_OS系统调用包装中一个常用的错误代码。但是,任何来自handle_* 方法的负数都将触发handle_close

 

设计准则4将所有Event_Handler清扫活动限制在handle_close清扫方法中。一般而言,将所有的清扫活动合并到handle_close方法中,而不是分散在事件处理器的各个handle_* 方法中要更为容易。在处理动态分配的、必须用delete this来清除的事件处理器时,特别需要遵从此设计准则(见准则9)。

设计准则5:不要将绝对时间用作ACE_Reactor::schedule_timer的第三或第四参数。一般而言,这些参数应该小于一个极长的延迟,更远小于当前时间。

设计准则6不要delete不是动态分配的事件处理器。任何含有delete this、而其类又没有私有析构器的handle_close方法,都有可能违反这一设计准则。在缺乏一种能够静态地识别这一情况的规约检查器时,应该在delete this的紧前面加上注释,解释为何要使用这一习语。

设计准则7总是从堆中动态分配具体事件处理器。这是解决许多与具体处理器的生存期有关的问题的相对直接的方法。如果不可能遵从此准则,必须在具体事件处理器登记到ACE_Reactor时给出注释,解释为什么不使用动态分配。该注释应该在将静态分配的具体处理器登记到ACE_Reactorregister_handler语句的紧前面出现。

 

设计准则8ACE_Event_Handler退出它们“生活”的作用域之前,从与它们相关联的ACE_Reactor中将它们移除掉。该准则应在未遵从准则7的情况下使用。

设计准则9只允许在handle_close方法中使用delete this习语,也就是,不允许在其他handle_* 方法中使用delete this。该准则有助于检查是否有与删除非动态分配的内存有关的潜在错误。自然,与ACE_Reactor无关的组件可以拥有不同的对自删除进行管辖的准则。

设计准则10仅在为具体事件处理器所登记的最后一个事件已从ACE_Reactor中移除时执行delete this操作。过早删除在ACE_Reactor上登记了多个事件的具体处理器会导致“晃荡的指针”,遵从此准则可以避免发生这样的情况。

设计准则11:当你不再需要具体事件处理器的handle_output方法被回调时,清除WRITE_MASK

设计准则12:确定get_handle方法的特征与ACE_Event_Handler基类中的一致。如果你不遵从此准则,并且你“隐式地”将ACE_HANDLE传递给ACE_ReactorACE_Event_Handler基类中的缺省get_handle将返回-1,而这是错误的。

设计准则13:当连接关闭时(或当连接上发生错误时),从handle_* 方法中返回一个负值

设计准则14:handle_close方法中调用remove_handler时,总是传递给它DONT_CALL标志。该准则确保ACE_Reactor不会递归地调用handle_close方法。下面的代码演示怎样应用此准则:

有效使用反应堆的设计准则

7.5 有效使用反应堆的设计准则     ACE_Reactor是事件多路分离和事件处理器分派的强大构架。但是,像其他构架一样,学习使用ACE_Reactor需要时间和努力。缩短学习曲线的的一种途径是...

Netty学习之旅------线程模型前置篇Reactor反应堆设计模式实现(基于java.nio)

本文提供Reactor线程模型的代码实现,基于java.nio包,旨在帮助大家更加容量的理解Reactor反应堆的设计思想,为Netty线程模型打下扎实的基础。...

《认知与设计——理解UI设计准则》笔记(3) 我们寻找和使用视觉结构

在第2章里面提到了,当人们在软件和网站中导航时,他们并不仔细检查屏幕并阅读每一个词,他们会很快地扫描相关信息。本章将展示几个例子来说明当信息以简洁和结构化的方式呈现时,人们更容易浏览和理解。  ...
  • ysydao
  • ysydao
  • 2012年05月14日 09:35
  • 386

ubuntu14.04安装caffe+cuda7.5+cudnn5.0+opencv3.0(亲测有效)

ubuntu14.04安装caffe+cuda7.5+cudnn5.0+opencv3.0此博客为原始博客,可以转载,但是转载请注明出处。先介绍一下本人电脑配置:笔记本双显卡,N卡是gtx1060(因...

半同步/半反应堆模型(使用线程池)的TCP服务器例子

在半同步/半异步模式中“同步”和“异步”与I/O模型中同步、异步的概念不同:I/O模型中,同步和异步区分的是内核向应用程序通知的是何种I/O事件(是就绪事件还是完成事件),以及该由谁来完成I/O读写(...

有效的使用和设计COM智能指针——条款17:重载运算符时应当符合C/C++约定

条款17:重载运算符时应当符合C/C++约定 更多条款请前往原文出处:http://blog.csdn.net/liuchang5 假设我们用了第三方的stack模版类,他的pop函数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:7.5 有效使用反应堆的设计准则
举报原因:
原因补充:

(最多只允许输入30个字)