admin11 发表于 2009-11-20 14:13:14

关于递归互斥体与非递归互斥体

在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,这是怎么回事?

modern 发表于 2009-11-20 16:39:12

1.ACE_Thread_Mutex在windows下底层实现是临界区,因此是递归的。linux是非递归的。
2.全工程查一下是否有调用schedule_wakeup与register_handler

winston 发表于 2009-11-20 18:16:48

才看到邮件,modern已经解答了。你的测试应该是windows上面的测试吧。下面实现就是支持递归。

ztenv 发表于 2011-2-24 14:04:50

学习了,
页: [1]
查看完整版本: 关于递归互斥体与非递归互斥体