找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4183|回复: 4

Linux下handle_close无法退出

[复制链接]
发表于 2010-1-13 20:24:11 | 显示全部楼层 |阅读模式
当客户端连接到上面的服务器类后,成功启动svc线程,这时如果客户端断开连接,进入handle_close函数,则执行到delete this时,会在析构函数中死循环,一直出不来,导致handle_close无法退出,不启动svc则无该问题
    Windows下没有这种问题
    请教牛人帮忙解释一下是啥问题啊??

class ServerServiceHandler : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
{
.......
};

int ServerServiceHandler::open(void*)
{
   activate(THR_NEW_LWP, 1);
  ......
}

int ServerServiceHandler::handle_close(ACE_HANDLE h, ACE_Reactor_Mask mask)
{
   .....
   delete this;
  .....
}

int ServerServiceHandler::svc()
{
   ACE_Time_Value tv(1, 0);
   while (true)
  {
      ACE_Message_Block *mb;
     if (this->getq (mb, &tv) == -1)
    {
       continue;
    }
}
发表于 2010-1-13 23:12:32 | 显示全部楼层
没遇到过,
不过既然已经定位到死循环到析构函数,
还不好办,把堆栈贴出来,看到底锁在哪就成了。
发表于 2010-1-14 14:45:55 | 显示全部楼层
不太明白,你在ServerServiceHandler为什么要用到svc()?
而且里面的代码是
发表于 2010-1-14 14:46:58 | 显示全部楼层
ACE_Time_Value tv(1, 0);
   while (true)
  {
      ACE_Message_Block *mb;
     if (this->getq (mb, &tv) == -1)
    {
       continue;
    }

你的队列为什么在这里循环?看不太懂你的想法。
 楼主| 发表于 2010-1-15 13:17:41 | 显示全部楼层
已经找到原因,handle_close里面将svc退出,但是svc退出又会导致handle_close被调用
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 13:28 , Processed in 0.052796 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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