子牛 发表于 2013-1-15 13:50:49

这个线程该如何退出

class CommandHandler: public ACE_Task_Base
{
public:      
      virtual int svc(void)
      {
                int nRet = 0;
                /* select_reactor 可能在阻塞过程中被信号中断(errno=4<EINTR>) */
                while(ACE_Reactor::instance()->reactor_event_loop_done() == 0)
                {
                        ACE_Reactor::instance()->owner( ACE_OS::thr_self() );
                        nRet = ACE_Reactor::instance()->run_reactor_event_loop();
                        if(nRet >= 0)
                              break;
                }
                return nRet;
      }
};



CClientMessage::CClientMessage(void)
{
m_timbreath.begin_count();
m_breath_sec = 1000;
//m_user.user_state(EN_USER_NULL);
//MyTimerHandler * timer = new MyTimerHandler ();
ACE_Time_Value initialDelay (1);//初始延时时间
ACE_Time_Value interval (1);      //间隔时间
ACE_Reactor::instance()->schedule_timer (this,
0,
initialDelay,
interval);
//ACE_Reactor::instance ()->run_reactor_event_loop ();
int nReturn = m_cmd_handle.activate(THR_NEW_LWP|THR_JOINABLE,1);
ACE_ASSERT(nReturn==0);
}

落单de雄狮 发表于 2013-1-15 17:18:34

class CommandHandler: public ACE_Task_Base
{
public:      
         virtual int svc(void)
         {
               int nRet = 0;
               /* select_reactor 可能在阻塞过程中被信号中断(errno=4<EINTR>) */
               while ( _flag )
               {
                         if ( ACE_Reactor::instance()->reactor_event_loop_done() == 0 )
                         {
                           ACE_Reactor::instance()->owner( ACE_OS::thr_self() );
                           nRet = ACE_Reactor::instance()->run_reactor_event_loop();
                           if(nRet >= 0)
                                 break;
                         }
               }
               return nRet;
         }
};


nettoobad 发表于 2013-2-11 23:38:43

run_reactor_event_loop()本身就会开一个线程来调用handle_events。
建议不要使用这么复杂的线程退出判断。很有可能发生死锁啊。

线程退出的判断条件越简单越好。

向python编程思路学习。简单为美!
页: [1]
查看完整版本: 这个线程该如何退出