在Reactor的模式,有一种辅助的通知机制Notify机制,简单说就是通过通知发起者调用 notify函数,notify的消息被保存在一个管道中,handle_event的处理中会检查这个管道中是 否有通知数据,如果有就根据通知的消息,会根据默认的通知消息的类型去调用hanle_input等函数。
ACE Reactor的默认Notify方式采用的是ACE_Pipe,ACE_Pipe是一个跨平台的管道实现。标准情况来讲,采用的实现,但是在最大的两个平台Windows和Linux上,ACE的实现是采用的Socket实现。很多管道特性所特有的东西,在这两个平台上是无法使用ACE_Pipe实现的。比如,管道的特性可以保证在暂时没有接受者的情况下使用,而Socket是不可能有这个特性的。你必须保证先有接受者,后有发送者的时序。
可以通过定义ACE_HAS_REACTOR_NOTIFICATION_QUEUE的宏编译ACE,这样ACE将不使用ACE_Pipe作为Notify消息的管道,而使用一个自己的内存队列保存Notify消息,这个队列是动态扩展的。而且由于是内存操作,性能方面没有太大问题。
大体位置在重复编译定义后面,#include /**/ "ace/pre.h"前面。保证这个宏起到作用。 #ifndef ACE_CONFIG_LINUX_H #define ACE_CONFIG_LINUX_H //使用内存队列作为Notify Queue #define ACE_HAS_REACTOR_NOTIFICATION_QUEUE #include /**/ "ace/pre.h"
That being said,the standard C++ containers are recommended for application development when you are using ACE.