找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6046|回复: 1

ACE_Svc_Handler的关闭问题

[复制链接]
发表于 2011-11-16 00:23:54 | 显示全部楼层 |阅读模式
在linux下开发了一个服务器我用reactor创建了ACE_Svc_Handler的派生类
目前运行良好,有一个问题很郁闷:
服务器有些时候需要强制关闭连接也就是派生的handler对象,根据ace的资料,建议通过reactor的线程关闭,我的做法如下:
(1)反注册我的处理类,并关闭socket
代码如下:
reactor()->remove_handler(this, ACE_Event_Handler::ALL_EVENTS_MASK|ACE_Event_Handler::DONT_CALL);
                this->peer_.close();
(2)然后通过notify触发自身的handle_except
(3) 在稍后的handle_except里面进行默认的关闭,如delete this

但是某些情况下,我在delete this之后,reactor还会检测到对端的关闭,也就是reactor即将触发这个已经删除的对象的handle_input,我在tp_reactor的堆栈里面可以看到这一情况。
这时候就会出错。

现在没有办法只是在notify前面sleep一下来减少这种现象的发生。
我的意思是:reactor还没有调用到这个对象的相应handle_input,在框架里面就会出错,因为已经删除了对象。若是已调用到handle_input当然可以通过我自己的机制去保证。

不知道大家有没有碰到此类似问题。

我想大致的原因是这样的:
服务器这边主动关闭的同时,客户端也关闭了相应的连接。
当服务器还没有完全走完关闭流程的时候,却检测到了对端的关闭通知。
发表于 2011-11-16 13:06:10 | 显示全部楼层
是否有代码?我感觉还是线程同步的问题。你取消信息注册后,因为同步的原因,接收到的信息还是送了过来。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-22 16:56 , Processed in 0.016540 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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