sunlock 发表于 2011-11-16 00:23:54

ACE_Svc_Handler的关闭问题

在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当然可以通过我自己的机制去保证。

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

我想大致的原因是这样的:
服务器这边主动关闭的同时,客户端也关闭了相应的连接。
当服务器还没有完全走完关闭流程的时候,却检测到了对端的关闭通知。

winston 发表于 2011-11-16 13:06:10

是否有代码?我感觉还是线程同步的问题。你取消信息注册后,因为同步的原因,接收到的信息还是送了过来。
页: [1]
查看完整版本: ACE_Svc_Handler的关闭问题