Windows上的递归互斥?

时间:2012-10-11 07:01:27

标签: windows mutex condition-variable recursive-mutex

据我了解,在Windows上,CRITICAL_SECTION只能用作非递归互斥锁。要获得递归互斥锁,您必须使用OpenMutex和朋友。

但是,AFAIU,Win32 Mutex不能与条件变量一起使用(InitializeConditionVariable等)

有没有办法在Windows上结合条件变量使用递归互斥?

2 个答案:

答案 0 :(得分:4)

valdo的评论是对的。 CRITICAL_SECTION 是递归的。以下是来自MSDN的引文:“在线程拥有关键部分的所有权后,它可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行。”问题解决了。

答案 1 :(得分:-1)

这没有任何意义。从语义上讲,条件变量的关键是你在等待时原子地释放锁 - 从而允许其他线程获取锁以执行你正在等待的事情。但是,递归互斥锁上的“释放”操作实际上可能无法将其解锁,因此在释放后等待可能会死锁。你想要一种强有力的方法这一事实表明你的设计或你对条件变量的理解有问题。

考虑一下 - 当一个锁定递归互斥锁的函数调用一个获取第二个锁然后调用sleep函数的函数时会发生什么?如果释放锁定,则第一个函数的逻辑将会中断,因为对象将在锁定时对其进行修改。如果没有释放锁,那么等待将会死锁,因为它等待的东西永远不会发生,因为它持有另一个线程需要实现它的锁。

没有合理的方法来使用条件变量而不知道你是否已经锁定它。如果您知道是否有锁,则不需要递归锁定功能。如果您知道您已经有锁,请不要打扰调用锁定功能。如果你知道你还没有锁定,那么即使锁定函数不是递归的,它也能正常工作。