knewsticker 发表于 2008-2-26 11:14:05

ACE_Task 句柄泄露问题

我现在有个服务程序,会频繁的开启和关闭ACE_Task ,当次数多了就会发生句柄泄露,泄露的句柄数并不是随开关次数线形增长。测试结果为:2000次 涨1个句柄,10000次 涨2个句柄,200000 涨3个或4个。我用的操作系统是windows server 2003 ,编译器 :ms2005(vc8.0) , ACE 版本:5.5 和5.6 都试了,请问大家有什么好的方法解决。

peakzhang 发表于 2008-2-26 12:03:40

很难说是TASK的问题,需要自己仔细排查了。不过说句题外话,不建议你频繁的开关task,因为task使用线程实现的,这样操作会导致同步容易出错 - 线程调用次序是乱序的,OS自己管。而且性能也不好。

knewsticker 发表于 2008-2-26 13:36:25

考虑到系统会运行2年以上,我才做这样的压力测试的,代码片断如下:
virtual int svc (void)
{
        m_StartEvent.signal();
    for (ACE_Message_Block *message = 0; ; )
      {
      
      if (this->getq (message) == -1)
          ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
                           ACE_TEXT ("getq")),
                            -1);

      if (message->msg_type () == ACE_Message_Block::MB_HANGUP)
          {
                          message->release ();
                          
            break;
          }
      
      void *recordedMessage =
          (void *)message->rd_ptr ();

                int msg_len = (int)(message->length());

      if (this->process (recordedMessage, msg_len) == -1)
          {
            message->release ();
            ACE_ERROR_RETURN ((LM_ERROR,
                               ACE_TEXT ("%p\n"),
                               ACE_TEXT ("process")),
                              -1);
          }

      ACE_DEBUG ((LM_DEBUG,
                  ACE_TEXT ("Basic_Task::svc() - ")
                  ACE_TEXT ("Continue to next stage \n" )));
      if (this->next_step (message) < 0)
          {
            ACE_ERROR ((LM_ERROR,
                        ACE_TEXT ("%p\n"),
                        ACE_TEXT ("put_next failed")));
            message->release ();
            break;
          }

      }

    return 0;
}


virtual int close (u_long flags)
{
    int rval = 0;

    if (flags == 1)
      {
              m_StartEvent.wait();
      ACE_Message_Block *hangup = new ACE_Message_Block ();
      hangup->msg_type (ACE_Message_Block::MB_HANGUP);
      if (this->putq (hangup) == -1)
          {
            hangup->release ();
            ACE_ERROR_RETURN ((LM_ERROR,
                               ACE_TEXT ("%p\n"),
                               ACE_TEXT ("Task::close() putq")),
                              -1);
          }

      rval = this->wait ();
      }

    return rval;
}

我用windbg htrace 查了,发现是ACE_Thread_Mananger::exit() 中会申请句柄,但没有释放,我不知道程序怎么会调用这个??
页: [1]
查看完整版本: ACE_Task 句柄泄露问题