azoiu 发表于 2011-3-8 09:20:10

问个关于Proactor群发消息的问题

本帖最后由 azoiu 于 2011-3-8 09:28 编辑

本人ACE新手,请教大家几个问题:
异步发送消息的时候,读取的是rd_ptr() 还是 base()呢?因为我看收消息的时候,写入的话会从ACE_Message_Block 的wr_ptr()开始写。
异步发送消息的时候,如果要群发,一个ACE_Message_Block 会被多次使用,这样的话每次rd_ptr都会被往后移吗?
还有就是handle_write_stream我要释放这个ACE_Message_Block,这样的话会多次释放。我应该自己在ACE_Message_Block头部保存一个引用计数吗?

winston 发表于 2011-3-8 10:49:16

rd_ptr()是操作读取内容的函数。
群发的话很简单,要发多少就增加多少个引用计数,然后发送一个减少一个,这样就不需要处理数据移动了。

azoiu 发表于 2011-3-8 12:56:01

刚网上查了一下,明白了。ACE_Message_Block有个duplicate()方法可以用。
ACE_Message_Block::duplicate() 只会复制数据的指针不会复制数据本身
ACE_Message_Block::release() 每个块只要都调用release()导致计数器-- 到最后一个ACE_Message_Block 也被用完的时候,数据块就会被释放了

freeeyes 发表于 2011-3-8 16:32:31

ACE_Message_Block的数据分为深拷贝和浅拷贝。
深拷贝拷贝的数据,浅拷贝复制的是指针。
如果是群发,建议使用多个ACE_Message_Block,虽然是可以用引用计数器,不过这里或许会牵扯到多线程访问,锁是比较消耗资源的。

azoiu 发表于 2011-3-8 19:24:25

内存复制一份的速度应该比网络IO操作快很多,不过如果加锁的部分只是一个计数的加减,应该会很快的吧……群发不会对整个数据块的访问锁的话就可以
页: [1]
查看完整版本: 问个关于Proactor群发消息的问题