如果ACE_Reactor::Instance()对象初始与run_reactor_event_loop不在同一线程,导致超时事件无法派发,原因ACE_Reactor::expire_timers 函数里对 线程一致性做了判断,库实际代码如下:
int ACE_WFMO_Reactor::expire_timers(void)
{
if( ACE_Thread::self() == this->owner_)
{
return this->timer_queue_->expire();
}
else
{
return 0;
}
}
测试代码如下
#include <iostream>
#include <ace/Event_Handler>
#include <ace/Reactor.h>
#include <string>
class TestEventHandler: public ACE_Event_Handler
{
public:
void start()
{
ACE_Time_Value tv(3, 0);
ACE_Reactor::instance()->schedule_timer( this, 0x00, tv, tv );
}
void stop()
{
ACE_Reactor::instance()->cancel_timer(this);
}
public:
virtual int handle_timeout( const ACE_Time_Value ¤t_time, const void *act = 0)
{
std::cout<<"handle_timeout\n";
}
};
class ReactarTask: public ACE_Task<ACE_NULL_SYNCH>
{
public:
void start()
{
this->activate();
}
void stop()
{
ACE_Reactor::instance()->end_reactor_event_loop();
}
virtual int svc()
{
ACE_Reactor::instance()->run_reactor_event_loop();
}
};
int main(int argc, char *argv[])
{
//如果main不是入口函数,注意此处添加ACE::init();
/**
注意:如果在此处添加如下代码,会导致定时器无法派发,但其它读取派发事件不影响
原因是ACE_Reactor::instance()->run_reactor_event_loop 在子线程中处理
如果不在子线程中ACE_Reactor::instance()->run_reactor_event_loop不会有问题
ACE_Reactor::instance();
*/
ReactarTask reactor;
reactor.start();
TestEventHandler t;
t.start();
std::string str;
std::cout<<"input to exit:";
std::cin>>str;
t.stop();
reactor.stop();
//如果main不是入口函数,注意此处添加ACE::fini();
return 0;
}