找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5721|回复: 9

ACE_Message_Block中的lock_strategy的管理的问题

  [复制链接]
发表于 2010-7-13 21:49:32 | 显示全部楼层 |阅读模式
由于在使用ACE_Message_Block中要使用到同步锁,现在有个问题想请教一下:
查看ACE的源代码,ACE_Message_Block是不负责删除那个lock_strategy指针的,那我应该如何管理传递给ACE_Message_Block的指针呢?我查看ACE的例子,发现例子中直接使用一个static对象来管理所有ACE_Message_Block对象的同步问题,但是如果是这样的话,那是不是额外的降低了同步的效率(因为完全无关的对象其实是可以同时进行操作的,如果都使用一个lock对象,则变成了线性的了)。

请问大侠们的做法是怎么样的啊?
发表于 2010-7-13 22:00:09 | 显示全部楼层
例子是为了测试正确性,所以有时候不会考虑效率的问题,至于如何使用同步锁,这就看你的实际情况了,你可以为每个ACE_Message_Block创建一个同步对象,只要你在别处保留了这个同步对象,在不需要的时候释放掉就没问题了。
 楼主| 发表于 2010-7-14 00:14:50 | 显示全部楼层
这样的设计总是让人很奇怪,为什么ACE_Message_Block不能设计成自己管理那个多线程锁的生命周期呢?ACE中不是有ACE_Null_Lock吗,这样的设计我认为更好些
发表于 2010-7-14 09:17:33 | 显示全部楼层
template <class ACE_LOCK>
class ACE_Locked_Data_Block : public ACE_Data_Block

应该是你想要的管理的东西,但是ACE_Message_Block还没有参数可以指定成ACE_Locked_Data_Block
发表于 2010-7-14 09:26:56 | 显示全部楼层
在ACE_Message_Block内部使用所策略,真的有必要么。
建议先审视一下自己的应用是否真的必须要这么做,
如果实在绕不过去,再考虑修改ACE的源代码。
 楼主| 发表于 2010-7-15 20:44:35 | 显示全部楼层
在多线程环境下使用到了其中的duplicate,这个锁肯定是必要的,我现在就另外生成一个锁队列,然后让生成的ACE_Message_Block依次引用他们,避免所有的对象都是用同一个锁,我觉得也够用了。
发表于 2011-1-14 09:24:56 | 显示全部楼层
回复 6# yoogera


    具体的锁队怎么实现的?
发表于 2011-1-14 09:58:00 | 显示全部楼层
意思是:当release的时候怎么知道是否消息引用为0,怎么归还锁
 楼主| 发表于 2011-1-14 18:42:07 | 显示全部楼层
我这里的锁没有生命周期管理的问题,就是建立一个全局的所数组,然后另外一个计数器,每次需要的时候就从数组中获取下一个位置的锁给ACE_Message_Block使用,这样还是会有多个ACE_Message_Block使用同一个锁对象的问题,但是我觉得已经差不多够了。
发表于 2011-1-14 18:58:26 | 显示全部楼层
回复 9# yoogera


    哦。原来是这样,谢谢!我看看有其他办法没!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 02:12 , Processed in 0.014723 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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