ACE_Task 句柄泄露问题
我现在有个服务程序,会频繁的开启和关闭ACE_Task ,当次数多了就会发生句柄泄露,泄露的句柄数并不是随开关次数线形增长。测试结果为:2000次 涨1个句柄,10000次 涨2个句柄,200000 涨3个或4个。我用的操作系统是windows server 2003 ,编译器 :ms2005(vc8.0) , ACE 版本:5.5 和5.6 都试了,请问大家有什么好的方法解决。 很难说是TASK的问题,需要自己仔细排查了。不过说句题外话,不建议你频繁的开关task,因为task使用线程实现的,这样操作会导致同步容易出错 - 线程调用次序是乱序的,OS自己管。而且性能也不好。 考虑到系统会运行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]