函数的原型:
template <ACE_SYNCH_DECL> ACE_INLINE int
ACE_Task<ACE_SYNCH_USE>::putq (ACE_Message_Block *mb, ACE_Time_Value *tv)
putq 所作的动作是将 mb所对应的message 的指针挂在了ACE_Task::msg_queue_的尾部。没有实际的复制动作。所以必须保证mb对应的对象在ACE_Task的生命周期内不会被析构,才能保证putq这个动作是有效的。参考下面的例子。
tt.putq(&mb21);
此时插入mb21不会出错。但是当tt.getq执行的时候,mb21实际已经析构
使得tt中的ACE_Message_Queue中的chain断裂,信息丢失。pmb22,pmb13虽被
插入,但是不会被get到。所以最后输出是
if (2 == i)
{
tt.putq(pmb13);
}
等待输出完毕,重新插入“close”使程序结束。
有new 创建的ACE_Message_Block 插入ACE_Task后,在ACE_Task析构的时候一起析构。所以不用担心会造成内存泄露,也不要在程序结尾再delete.
尽量使用new的方式创建ACE_Message_Block并插入ACE_Task.