找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5423|回复: 4

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

[复制链接]
发表于 2011-3-8 09:20:10 | 显示全部楼层 |阅读模式
本帖最后由 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头部保存一个引用计数吗?
发表于 2011-3-8 10:49:16 | 显示全部楼层
rd_ptr()是操作读取内容的函数。
群发的话很简单,要发多少就增加多少个引用计数,然后发送一个减少一个,这样就不需要处理数据移动了。
 楼主| 发表于 2011-3-8 12:56:01 | 显示全部楼层
刚网上查了一下,明白了。ACE_Message_Block有个duplicate()方法可以用。
ACE_Message_Block::duplicate() 只会复制数据的指针不会复制数据本身  
ACE_Message_Block::release() 每个块只要都调用release()导致计数器-- 到最后一个ACE_Message_Block 也被用完的时候,数据块就会被释放了
发表于 2011-3-8 16:32:31 | 显示全部楼层
ACE_Message_Block的数据分为深拷贝和浅拷贝。
深拷贝拷贝的数据,浅拷贝复制的是指针。
如果是群发,建议使用多个ACE_Message_Block,虽然是可以用引用计数器,不过这里或许会牵扯到多线程访问,锁是比较消耗资源的。
 楼主| 发表于 2011-3-8 19:24:25 | 显示全部楼层
内存复制一份的速度应该比网络IO操作快很多,不过如果加锁的部分只是一个计数的加减,应该会很快的吧……群发不会对整个数据块的访问锁的话就可以
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 03:01 , Processed in 0.014843 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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