ACE_Message_Queue<ACE_MT_SYNCH>::putq ()使用时需要注意的地方
来源:互联网 发布:手机淘宝h5页面签到 编辑:程序博客网 时间:2024/05/17 22:33
函数声明
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块在正常的逻辑流程中不会走到。
- ACE_Message_Queue<ACE_MT_SYNCH>::putq ()使用时需要注意的地方
- 使用setById时需要注意的地方
- 使用nusoap时需要注意的地方
- ACE_Task::putq 的使用
- 使用TextBox的SelectionStart时需要注意的地方
- 使用 IAR for AVR 时需要注意的几个地方
- Tomcat中使用JNDI时需要注意的地方
- AS3 TextEvent使用时需要注意的地方
- 使用gtk库时需要注意的地方
- 使用ireport+jasperreports生成报表时需要注意的地方
- QtCreator使用时需要注意的一个地方。
- Visual Studio使用时需要注意的地方--收集更新
- Android AsyncTask 使用时需要注意的地方
- 使用splice删除数组时,需要注意的地方
- 使用Idea时需要安装和注意的地方
- unix pthread_create 函数使用时需要注意的一个地方
- 使用Win2003需要注意的地方
- 使用Win2003需要注意的地方
- Error: /etc/resolv.conf isn't a symlink, not doing anything
- 关于Java中序列化的小问题
- 开始做点事
- 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named NSLayoutConstrain
- 全排列,递归。
- ACE_Message_Queue<ACE_MT_SYNCH>::putq ()使用时需要注意的地方
- ffmpeg在eclipse中的开发配置
- Using the SSL API【Erlang手册翻译】
- flex的一些函数随机数random(),round(),ceil(),floor()
- 一位软件工程师的6年总结
- QTableWidget的使用详细介绍和美工总结
- 发了个自己写的COCOS2D-X的塔防
- 20个2013年最值得关注的网页设计趋势
- JAVA中的内存溢出