ACE 定时器 不回调handle_timeout的问题

如果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 &current_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;  
    

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值