ACE_Message_Queue<ACE_MT_SYNCH>::putq ()使用时需要注意的地方

13 篇文章 1 订阅

函数声明

 template<ACE_SYNCH_DECL >
int ACE_Task< ACE_SYNCH_DECL >::putq 	( 	ACE_Message_Block *  	,
		ACE_Time_Value *  	timeout = 0 
	) 	

timeout参数

timeout参数使用绝对时间,而不是相对时间。使用时我们可以使用ACE_OS::gettimeofday ()获取系统当前时间,再加上一个相对时间来确定超时时间。

ACE_Message_Block::duplicate ()的使用

ACE_Message_Block *mb;
……
……
if (test_task->putq (mb->duplicate (), timeout) < 0)
{
    mb->release ();
}

mb->release ();

上面的代码在正常情况下不会引起问题。在正常情况下,程序可能运行很多年都不会发现什么问题,但却隐含着一个不容易出现的小问题。代码作者认为,在入队列前先增加了数据块的引用计数,入队成功后,减少1次引用计数,取队列的代码最终再使用完MB后再次release ()降低引用计数时,即可释放数据块;如果入队失败了,在if块中降低1次引用计数,在外面再release一次会释放数据块。实际上这时候悲剧就发生了。if块中的确会降低数据块的引用计数,但同时会设置自己对数据块的指针为0。再次release虽然程序不会报错,但内存却泄露了。因为duplicate浅拷贝,会动态分配一个ACE_Message_Block对象,这个对象中保留着对数据块的引用计数,因此数据块和浅拷贝动态分配的ACE_Message_Block都得不到释放。

这个问题隐藏的比较深,if块在正常的逻辑流程中不会走到。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值