找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3716|回复: 2

ACE_Task 句柄泄露问题

[复制链接]
发表于 2008-2-26 11:14:05 | 显示全部楼层 |阅读模式
我现在有个服务程序,会频繁的开启和关闭ACE_Task ,当次数多了就会发生句柄泄露,泄露的句柄数并不是随开关次数线形增长。测试结果为:2000次 涨1个句柄,  10000次 涨2个句柄,  200000 涨3个或4个。我用的操作系统是windows server 2003 ,编译器 :ms2005(vc8.0) , ACE 版本:5.5 和5.6 都试了,请问大家有什么好的方法解决。
发表于 2008-2-26 12:03:40 | 显示全部楼层
很难说是TASK的问题,需要自己仔细排查了。不过说句题外话,不建议你频繁的开关task,因为task使用线程实现的,这样操作会导致同步容易出错 - 线程调用次序是乱序的,OS自己管。而且性能也不好。
 楼主| 发表于 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() 中会申请句柄,但没有释放,我不知道程序怎么会调用这个??
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-25 03:50 , Processed in 0.020211 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表