首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归和非递归锁(互斥锁)

递归和非递归锁(互斥锁)
EN

Stack Overflow用户
提问于 2014-10-30 14:30:26
回答 4查看 5.6K关注 0票数 4

在我的程序中,我的死锁有问题。所以我一直在读关于锁的文章,但问题是大多数信息都是不一致的,或者没有定义平台。在Recursive Lock (Mutex) vs Non-Recursive Lock (Mutex),最被接受的答案是:

因为递归互斥具有所有权,所以获取互斥的线程必须是释放互斥的线程。在非递归互斥的情况下,没有所有权,任何线程通常都可以释放互斥,不管哪个线程最初使用互斥。在许多情况下,这种类型的“互斥”实际上是一种信号量操作,您不一定要使用互斥作为排除设备,而是将它用作两个或多个线程之间的同步或信令设备。

在评论中,人们说这是不正确的,也没有参考。所以..。

1)如果我将一个非递归互斥锁锁定在线程A中,那么线程B可以在不抓取锁的情况下解锁吗?

2)如果在锁中由线程A和线程B调用在非递归互斥中获取锁,那么线程B会等到锁被释放后才获得锁,还是会抛出异常?这种情况在递归互斥中如何?(在其他无法得出适当结论的问题中也进行了讨论)

3)当使用递归锁时,在进程终止时,是否必须释放所有递归锁?(取决于没有发生的过程结束的位置)

4)当我谨慎地使用递归锁和非递归锁的组合时,我看到了哪些问题?

PS:只使用windows平台和std::thread

EN

Stack Overflow用户

发布于 2016-11-30 17:50:41

以下内容来自Linux pthread_mutex_lock手册页,

还可以静态地初始化pthread_mutex_t类型的变量,使用常量PTHREAD_MUTEX_INITIALIZER (用于快速互斥)、THREAD_RECURSIVE_MUTEX_INITIALIZER_NP (用于递归互斥)和PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP (用于错误检查互斥)。

error checking'' and递归‘互斥’上,pthread_mutex_unlock实际上在运行时检查互斥锁在入口,并且被现在调用pthread_mutex_unlock的同一个线程锁定。如果不满足这些条件,则返回错误代码,互斥锁保持不变。Fast‘mutexes不执行这样的检查,从而允许锁住的互斥对象被其所有者以外的线程解锁。这是不可移植的行为,不能依赖。

看来,“非递归互斥类型的线程以外的线程可以解锁锁定的互斥锁”。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26655715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档