yoogera 发表于 2010-7-13 21:49:32

ACE_Message_Block中的lock_strategy的管理的问题

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

请问大侠们的做法是怎么样的啊?

earthdog 发表于 2010-7-13 22:00:09

例子是为了测试正确性,所以有时候不会考虑效率的问题,至于如何使用同步锁,这就看你的实际情况了,你可以为每个ACE_Message_Block创建一个同步对象,只要你在别处保留了这个同步对象,在不需要的时候释放掉就没问题了。

yoogera 发表于 2010-7-14 00:14:50

这样的设计总是让人很奇怪,为什么ACE_Message_Block不能设计成自己管理那个多线程锁的生命周期呢?ACE中不是有ACE_Null_Lock吗,这样的设计我认为更好些

dwh0403 发表于 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

modern 发表于 2010-7-14 09:26:56

在ACE_Message_Block内部使用所策略,真的有必要么。
建议先审视一下自己的应用是否真的必须要这么做,
如果实在绕不过去,再考虑修改ACE的源代码。

yoogera 发表于 2010-7-15 20:44:35

在多线程环境下使用到了其中的duplicate,这个锁肯定是必要的,我现在就另外生成一个锁队列,然后让生成的ACE_Message_Block依次引用他们,避免所有的对象都是用同一个锁,我觉得也够用了。

nono436 发表于 2011-1-14 09:24:56

回复 6# yoogera


    具体的锁队怎么实现的?

nono436 发表于 2011-1-14 09:58:00

意思是:当release的时候怎么知道是否消息引用为0,怎么归还锁

yoogera 发表于 2011-1-14 18:42:07

我这里的锁没有生命周期管理的问题,就是建立一个全局的所数组,然后另外一个计数器,每次需要的时候就从数组中获取下一个位置的锁给ACE_Message_Block使用,这样还是会有多个ACE_Message_Block使用同一个锁对象的问题,但是我觉得已经差不多够了。

nono436 发表于 2011-1-14 18:58:26

回复 9# yoogera


    哦。原来是这样,谢谢!我看看有其他办法没!
页: [1]
查看完整版本: ACE_Message_Block中的lock_strategy的管理的问题