yoogera 发表于 2010-12-18 19:02:16

分享一个使用IOTerabit中使用ACE_Message_Block的注意事项

前两天经过使用IOTerabit改造的系统已经完成了,但是在测试R版的时候总是会挂掉,后进入程序进行调试,软件总是中断在和ACE_Message_Block相关的内存操作上,在我这里就是表现要么就是MessageBlockFactory的alloc_msg上,要么就是啊ACE_Message_Block的copy函数上,而且相关对象的this指针为0,调查各种情况后将问题定位在IOTerabit提供的MessageBlockFactory_T的alloc_msg和free_msg函数上,他采用的是Message_Block池子的方式,alloc_msg在池子中查找,如果有剩余的MB,则直接返回该MB,如果没有,则新建一个,free_msg则直接将MB放回池子(如果池子满了就删掉)。
问题就出自上面,由于我程序的服务端可能会将一个MessageBlock发送到多个客户端上去,所以我使用了Message_Block的duplicate方法(避免一次内测拷贝),所以就出现了
1、alloc_msg一次
2、duplicate多次
3、free_msg多次
的情况,所以后面的池子中可能出现多个MB对象实际指向同一个内存,再对这同一个内存的时候就发生的同步操作异常。

针对上面的问题,我想定制一个自己的MessageBlockFactory,但是遗憾的发现我无法使用IOTeabit的方法加入我自己的factory,不过幸好有源码,直接修改了为不使用池子,alloc_msg的时候就new一个ACE_Message_Block,在free_msg的时候就掉ACE_Message_Block的release方法。

这里还是对IOTerabit的MessageBlockFactory_T的实现表示异议:
1、他没有遵守ACE_Message_Block的设计理念,其实完全可以使用ACE_Message_Block构造中的Allocator通过内存池实现(即在ACE_Message_Block的底层提供池子来实现),而不必要在ACE_Message_Block的上面提供一个和原有设计不兼容的池子。
2、他提供了一个MessageBlockFactory_T的实现,但是没有提供给使用者扩展的方法,要么就只能修改源代码(我看他直接定义的一个对象,然后再AsynChannelFactory的构造函数中实现的)。

modern 发表于 2010-12-20 09:28:58

TProactor好像n久都没有更新了吧。
页: [1]
查看完整版本: 分享一个使用IOTerabit中使用ACE_Message_Block的注意事项