在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.