ACE_Select_Reactor from its event loop.
#include <ace/Select_Reactor_Base.h>
class ACE_Select_Reactor_Notify : public ACE_Reactor_Notify {
public:ACE_Select_Reactor_Notify (void);~ACE_Select_Reactor_Notify (void);virtual int open ( ACE_Reactor_Impl *, ACE_Timer_Queue * = 0, int disable_notify_pipe = 0 );virtual int close (void);virtual ssize_t notify ( ACE_Event_Handler * = 0, ACE_Reactor_Mask = ACE_Event_Handler::EXCEPT_MASK, ACE_Time_Value * = 0 );virtual int dispatch_notifications ( int &number_of_active_handles, const ACE_Handle_Set &rd_mask );virtual int handle_input (ACE_HANDLE handle);virtual void max_notify_iterations (int);virtual int max_notify_iterations (void);virtual void dump (void) const;ACE_ALLOC_HOOK_DECLARE;private:ACE_Select_Reactor_Impl *select_reactor_;ACE_Pipe notification_pipe_;int max_notify_iterations_;};
ACE_Select_Reactor is run in a multi-threaded program.  In
this case, we need to be able to unblock select() or poll()
when updates occur other than in the main
ACE_Select_Reactor thread.  To do this, we signal an
auto-reset event the ACE_Select_Reactor is listening on.
If an ACE_Event_Handler and ACE_Select_Reactor_Mask is
passed to notify, the appropriate handle_* method is
dispatched in the context of the ACE_Select_Reactor thread.
virtual int open (
    ACE_Reactor_Impl *,
    ACE_Timer_Queue * = 0,
    int disable_notify_pipe = 0
    );
virtual int close (void);
virtual ssize_t notify (
    ACE_Event_Handler * = 0,
    ACE_Reactor_Mask = ACE_Event_Handler::EXCEPT_MASK,
    ACE_Time_Value * = 0
    );
ACE_Select_Reactor.  This wakeups the ACE_Select_Reactor if
currently blocked in select()/poll().  Pass over both the
Event_Handler *and* the mask to allow the caller to dictate
which Event_Handler method the ACE_Select_Reactor will
invoke.  The ACE_Time_Value indicates how long to blocking
trying to notify the ACE_Select_Reactor.  If timeout == 0,
the caller will block until action is possible, else will wait
until the relative time specified in *timeout elapses).
virtual int dispatch_notifications (
    int &number_of_active_handles,
    const ACE_Handle_Set &rd_mask
    );
ACE_Select_Reactor.
virtual int handle_input (ACE_HANDLE handle);
ACE_Select_Reactor when a thread wants to
unblock us.
virtual void max_notify_iterations (int);
ACE_Select_Reactor_Notify::handle_input method will iterate and
dispatch the ACE_Event_Handlers that are passed in via the
notify pipe before breaking out of its recv loop.  By default,
this is set to -1, which means "iterate until the pipe is empty."
Setting this to a value like "1 or 2" will increase "fairness"
(and thus prevent starvation) at the expense of slightly higher
dispatching overhead.
virtual int max_notify_iterations (void);
ACE_Select_Reactor_Notify::handle_input method will iterate and
dispatch the ACE_Event_Handlers that are passed in via the
notify pipe before breaking out of its recv loop.
virtual void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;