|
在C++网络编程中说:某个线程在没有realease的情况下,两次获得它,会出现死锁。(在C++网络编程第一卷:132页---中文版)
ACE_Thread_Mutex是递归互斥体还是非递归互斥体?根据《ACE程序员指南(中文版)》224页的表14.1,似乎应该是非递归互斥体。
但是我在应用中,两次获得了一个ACE_Thread_Mutex,而没有出现死锁,这是为什么?
例子代码:
ACE_Thread_Mutex m_cMutex;
int CHandler:: PutMsg (CMessage *message,ACE_Time_Value *pTime)
{
ACE_GUARD_RETURN(ACE_Thread_Mutex,m,m_cMutex,0); // 同步保护
return CHandlerBase:: PutMsg(message,pTime);
}
int CHandler::nonblk_put (ACE_Message_Block *mb)
{
ACE_GUARD_RETURN(ACE_Thread_Mutex,m,m_cMutex,0); // 同步保护
return CHandlerBase::nonblk_put(mb);
}
intCHandlerBase: : PutMsg(CMessage *msg,ACE_Time_Value * timeout/* = 0 */)
{
if (State() != CHandlerBase::ESTABLISHED)
{
return -1;
}
....
return this->nonblk_put (message);
else
return this->msg_queue ()->enqueue_tail (message, timeout);
}
这个例子中的代码是从GateWay中借鉴来的。
还有,在“ACE57SRC\ACE_wrappers\apps\Gateway”中,多出使用了
ACE_Reactor::instance ()->cancel_wakeup (this, ACE_Event_Handler::WRITE_MASK)
而没有发现在哪儿注册ACE_Event_Handler::WRITE_MASK,这是怎么回事? |
|