找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4938|回复: 8

proactor 中HANDLER 的退出问题

[复制链接]
发表于 2008-11-18 15:49:10 | 显示全部楼层 |阅读模式
我需要对服务器的HANDLER进行管理,大家知道,每一个客户端连接进来的时候,可以调用make_newHandler产生出一个HANDLER来。但是,当客户端退出的时候,如何才能将服务器上的HANDLER退出掉呢。似乎不能直接删除这个指针?
   跪谢了.
发表于 2008-11-18 17:45:00 | 显示全部楼层
看书先。。。书上对这个问题解释的非常清楚了。

在客户端断开链接的时候,删除自身即可。
 楼主| 发表于 2008-11-19 08:54:03 | 显示全部楼层

再次提问

非常感谢斑竹的回答。为什么我在 handler_read_stream中delete this指针时,总是出现错误呢?
发表于 2008-11-19 11:06:57 | 显示全部楼层
一般是线程同步错误。碰见很多次了。
delete this执行过的时候,这个对象又被其它线程执行和操作了。
发表于 2008-11-29 21:18:19 | 显示全部楼层
这里要清楚一点就是 Procator 或者是 ACE_Asynch_Accept是不会为我们管理所有的客户端连接对象的。
当时他们会创建这些客户端对象。
对于Proactor,当客户端连接打开时,而且注册到Procator时,系统会为我们管理相关的连接,但是不是连接的对象也仅仅是连接的句柄而已。当关闭连接的句柄是Proacor内部会关闭句柄的相关资源,这点我们不必去干涉。

我们要处理的是在读取数据失败的时候 要关闭句柄,并删除这个客户端连接对象(但是不一定要马上删除)
建议结合ACE_Intrusive_Auto_Ptr 这个内嵌式智能指针的设计模式来管理我们的客户端对象,当程序中没有其它地方引用该客户端对象的时候在删除,而不是在读取数据失败的时候直接删除,当然这个时候关闭socket句柄是非常用必要的。

class My_ACE_Service_Handler: public ACE_Service_Handler;
ACE_Intrusive_Auto_Ptr<My_ACE_Service_Handler> +ACE_Proacor 来管理你的连接应该是一个不错的选择。
你必须在你的程序中有一个容器,用于 存放ACE_Intrusive_Auto_Ptr<My_ACE_Service_Handler>数据。
在 My_ACE_Service_Handler open打开时加入容器,在异步读取数据失败时关闭句柄斌从容器中删除连接。这样在intrusive_remove_ref 静态成员函数中当My_ACE_Service_Handler的引用技术为0时删除该对象。
发表于 2008-11-29 21:44:36 | 显示全部楼层
引用技术是很常用的办法。楼上兄弟的办法还没用过,改天测试一下。
发表于 2008-11-30 10:56:09 | 显示全部楼层
ACE_Intrusive_Auto_Ptr 没发现有此类啊?
发表于 2008-11-30 21:04:55 | 显示全部楼层
在这个Intrusive_Auto_Ptr.h文件中。我是5.6.6的版本。
发表于 2008-11-30 22:09:27 | 显示全部楼层
哦。难怪。我一般都用正式发布的版本,中间的版本很少使用。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-8 04:28 , Processed in 0.013956 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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