我在我的程序中遇到了死锁问题。所以我一直在阅读关于锁的问题,但问题是大多数信息不一致或者没有定义平台。在Recursive Lock (Mutex) vs Non-Recursive Lock (Mutex)最接受的回答说:递归和非递归锁(互斥锁)
由于递归互斥有主人翁意识,在线程 抓住互斥必须是释放互斥锁在同一个线程。在 非递归互斥体的情况下,没有所有权意识,任何线程通常都可以释放该互斥体,无论哪个线程本来是 接受互斥体。在许多情况下,这种类型的“互斥体”实际上更多的是信号量动作,在这种情况下,您不一定要使用互斥体作为排斥设备,而是将其用作两个或更多线程之间的同步或信号设备 。
在评论中,人们说这是不正确的,没有提及它。所以...
1)如果我在线程A中锁定了一个非递归互斥锁,线程B可以解锁它而无需获取锁?
2)如果线程A在一个非递归互斥体中进行了锁定,并且线程B调用了锁定,那么线程B是否等待,直到锁定被释放以获得锁定或将抛出一个异常?这个递归互斥体的情况呢? (也可以在其他问题中进行讨论,其中没有可以作出的正确结论)
3)当使用递归锁时,在进程终止时,是否必须释放所有递归锁? (取决于过程结束的地方没有发生)
4)当谨慎使用递归和非递归锁的组合时,我会注意哪些问题?
PS:只使用windows平台和std::thread
。
_The接受的答案是错误的,或者至少是非常说明其一点,“锁定互斥体可能比它与非递归互斥种所有者以外的其他线程来解锁”非常poorly._它似乎你现在接受的答案可能会使用警卫。 – bvj 2017-12-27 02:13:46