递归互斥体 有什么用?

gaojl0728 2008-12-19 02:46:24
常见的互斥体有两种:
l 非递归互斥体(nonrecursive mutex)——如果当前拥有互斥体的线程在没有首先释放它的情况下,试图再次获得它,就会导致死锁或失败;

l 递归互斥体(recursive mutex)——拥有互斥体的线程可以多次获得它而不会产生自死锁,只要这个线程最终以相同次数释放这个互斥体即可。


互斥体 本身就是排斥的,线程锁一次别的线程就不能再拿到锁了,再锁一次是什么意思?就是不明白这里.
...全文
480 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
c8413464 2011-11-01
  • 打赏
  • 举报
回复
如需要阅读该回复,请登录或注册CSDN!
二两就醉 2011-10-12
  • 打赏
  • 举报
回复
IceUtil::RecMutex _mutex; // Recursive mutex
void
f1()
{
IceUtil::RecMutex::Lock lock(_mutex);
// ...
}
void
f2()
{
IceUtil::RecMutex::Lock lock(_mutex);
// Some code here...
// Call f1 as a helper function
f1(); // Fine
// More code here...
}

这个代码能看出递归互斥体的用处了吧?
amoroso1860 2010-03-13
  • 打赏
  • 举报
回复
使用非递归互斥锁只是实现了代码的线程安全,但是并不能保证代码的异步信号安全。
设想一下,在某个线程获得了锁并准备访问一个共享资源时,发生了异步的信号而进入
信号处理代码执行,如果说信号处理代码中也会访问到相同的共享资源,那是不是就
线程死锁了呢?
为了应对这种情况,通常互斥锁的实现中会包含当前占有线程ID、递归计数器、使用数量
等信息。当前占有线程ID如果为0,则线程可以拥有该互斥锁,并将当前占有线程ID设置
为自己的ID,这样如果遇到上面所说的情况,只需要将递归计数器加一并继续执行,因此
避免了死锁的状况。当然了每次解锁都要将计数器减一。
lszzzz 2009-03-13
  • 打赏
  • 举报
回复
没有具体用过,锁递归调用的情况可能如下吧
void fun(void*)
{
mutex.Lock();
{
if(结束条件)
{
return;
}
else
{
//TODO
//共享资源操作

fun(void*);

}
}
mutex.Unlock();
}
hhyttppd 2008-12-19
  • 打赏
  • 举报
回复
我觉得就是为了解决这个问题的:递归获取是难免的
gaojl0728 2008-12-19
  • 打赏
  • 举报
回复
呵呵,我也是今天看到这个问题,就是想搞明白递归互斥体 有什么用处?
我目前还是想不到这样有什么好处。
hhyttppd 2008-12-19
  • 打赏
  • 举报
回复
呵呵,有时递归获取是难免的,我搞那个例子只是为说明“什么是递归获取互斥量”。
gaojl0728 2008-12-19
  • 打赏
  • 举报
回复
借用一下上面的代码:
void thread_fuc(void*)
{
//第一次上锁没疑问
mutex.Lock();
{
//共享资源...
....
//第二次上锁这是干什么?不用上锁也没问题的,因为前边的锁还没释放呢,别的线程想拿也拿到
mutex.Lock();
{
//共享资源
....
}
mutex.Unlock();
}
mutex.Unlock();
}
gaojl0728 2008-12-19
  • 打赏
  • 举报
回复
我的意思是 锁一次就达目的,为什么要锁两次呢,因为锁一次资源就已锁定,再锁一次这不是有毛病吗,
wap21 2008-12-19
  • 打赏
  • 举报
回复
帮顶
hhyttppd 2008-12-19
  • 打赏
  • 举报
回复
如:
void thread_fuc(void*)
{
mutex.Lock();
{
mutex.Lock();
{
//....
}
mutex.Unlock();
}
mutex.Unlock();
}

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧