本帖最后由 独来读网 于 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理解错了.
|