找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 10164|回复: 9

ACE_Message_Block使用duplicate release的疑问

[复制链接]
发表于 2012-7-9 19:14:27 | 显示全部楼层 |阅读模式
本帖最后由 独来读网 于 2012-7-9 20:13 编辑

今天,在看freeeyes的内存池使用方法,碰到了一个问题.
当前服务器S上连接着C1,C2,C3,C4.......等客户端,从客户端Cx收到一个消息mb,服务器S将这个消息mb发送给除Cx之外的所有客户端,即收到一个客户端消息,通过服务器向其它客户端发送.
按理,使用收到的mb这个数据块向其它客户端发送,等发送完成后,再将mb删除,这样可以提高效率.

因此我采用了mb->duplicate()进行了潜复制,在每次发送前调用一次mb->duplicate(),即要peer()->write()前调用一次duplicate(),若发送成功,在handle_write_out()中对mb进行release()一次,当然在最后peer()->write()后,会调用一次release()(release()对handle_read_in的mb计数器-1).
若按这样的模式,应该是所有都是成对的出现,不会出现内存泄露,而且刚好在所有发送完成之后才对mb进行真正的释放.

现在我碰到的问题是:mb->duplicate()了3次,mb->release()一次,里面的计数就变成0.难道不行.

查了相关的资料,说到创建新的mb时,locking strategy需要传入,但我这个mb是用在内存池里的,要是传入一个成员locking strategy,那么这个内存池所有时间内只能使用一个mb,而每一个mb都使用一个,那么locking strategy管理起来也是一个麻烦的事,即locking strategy也需要一个内存池,这样又加大了代码的复杂性.
ACE_NEW_MALLOC_NORETURN(mb,
       static_cast<ACE_Message_Block*>(m_pmsgallocator->malloc(sizeof(ACE_Message_Block))),
       ACE_Message_Block(u4Size, // size
       ACE_Message_Block::MB_DATA, // type
       0,
       0,
       m_pbuff_allocator, // allocator_strategy
       0, // locking strategy
       ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY, // priority
       ACE_Time_Value::zero,
       ACE_Time_Value::max_time,
       m_pdata_allocator,
       m_pmsgallocator
       ));


希望各位高手能帮我看看,帮我分解分解,还是我对这个ACE_Message_Block理解错了.
 楼主| 发表于 2012-7-10 07:31:32 | 显示全部楼层
怎么只有看的,没有回复的啊????
发表于 2012-7-10 13:04:39 | 显示全部楼层
因为看的都是菜鸟
 楼主| 发表于 2012-7-10 14:54:35 | 显示全部楼层
没人回复吗?我现在只能通过Clone来发送,这样的话,消耗在clone里的时间就有点多了,100个客户端,若从1个客户端接收数据,需要clone99次发送到其它端去.
要是用计数器,只使用这个就很方便了.

clone运行了24小时,内存没有增加,从17M左右的软件运行到现在的2M多点,好像应用程序还会定时清理一下内存啊?第一次感觉他还会减小.
发表于 2012-7-13 09:48:55 | 显示全部楼层
你问一下freeeyes就行了。
发表于 2012-9-22 23:44:42 | 显示全部楼层
我对这个问题也有兴趣,不知道楼主最后是怎么解决的。
发表于 2012-10-15 17:45:29 | 显示全部楼层
放代码~
发表于 2012-10-19 10:10:15 | 显示全部楼层
刷新,冲掉垃圾广告标题。
发表于 2013-6-17 11:19:34 | 显示全部楼层
ACE_Message_Block的duplicate(void)函数增加的是该block中所有的ACE_Data_Block的引用计数,返回了一个新申请的ACE_Message_Block对象,所以正确的用法是
ACE_Message_Block* mb2 = mb1->duplicate();
之后分别调用mb2->release()和mb1->release()
发表于 2013-7-24 15:26:04 | 显示全部楼层
没看明白,为什么duplicate和release不配对的问题后面扯到locking strategy的问题,按照楼上的说法配对了应该是没有问题的
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-22 11:04 , Processed in 0.019370 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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