找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6012|回复: 3

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

[复制链接]
发表于 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,这是怎么回事?
发表于 2009-11-20 16:39:12 | 显示全部楼层
1.ACE_Thread_Mutex在windows下底层实现是临界区,因此是递归的。linux是非递归的。
2.全工程查一下是否有调用schedule_wakeup与register_handler
发表于 2009-11-20 18:16:48 | 显示全部楼层
才看到邮件,modern已经解答了。你的测试应该是windows上面的测试吧。下面实现就是支持递归。
发表于 2011-2-24 14:04:50 | 显示全部楼层
学习了,
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 17:38 , Processed in 0.014215 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表