ACE_Message_Block使用duplicate release的疑问
本帖最后由 独来读网 于 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理解错了.
怎么只有看的,没有回复的啊???? 因为看的都是菜鸟 没人回复吗?我现在只能通过Clone来发送,这样的话,消耗在clone里的时间就有点多了,100个客户端,若从1个客户端接收数据,需要clone99次发送到其它端去.
要是用计数器,只使用这个就很方便了.
clone运行了24小时,内存没有增加,从17M左右的软件运行到现在的2M多点,好像应用程序还会定时清理一下内存啊?第一次感觉他还会减小. 你问一下freeeyes就行了。 我对这个问题也有兴趣,不知道楼主最后是怎么解决的。 放代码~ 刷新,冲掉垃圾广告标题。 ACE_Message_Block的duplicate(void)函数增加的是该block中所有的ACE_Data_Block的引用计数,返回了一个新申请的ACE_Message_Block对象,所以正确的用法是
ACE_Message_Block* mb2 = mb1->duplicate();
之后分别调用mb2->release()和mb1->release() 没看明白,为什么duplicate和release不配对的问题后面扯到locking strategy的问题,按照楼上的说法配对了应该是没有问题的
页:
[1]