据我了解,在 Windows 上 CRITICAL_SECTION 只能用作非递归互斥锁。要获得递归互斥锁,您必须使用 OpenMutex 和朋友。
但是,AFAIU、Win32 Mutex 不能与条件变量一起使用(InitializeConditionVariable 等)
有没有办法在 Windows 上将递归互斥锁与条件变量结合使用?
据我了解,在 Windows 上 CRITICAL_SECTION 只能用作非递归互斥锁。要获得递归互斥锁,您必须使用 OpenMutex 和朋友。
但是,AFAIU、Win32 Mutex 不能与条件变量一起使用(InitializeConditionVariable 等)
有没有办法在 Windows 上将递归互斥锁与条件变量结合使用?
瓦尔多的评论是正确的。CRITICAL_SECTION是递归的。这里引用 MSDN 的一段话:“线程拥有临界区所有权后,它可以对 EnterCriticalSection 或 TryEnterCriticalSection 进行额外调用,而不会阻塞其执行。” 问题解决了。
那没有任何意义。从语义上讲,条件变量的意义在于您在等待时自动释放锁——从而允许其他线程获取锁来执行您正在等待的事情。但是,递归互斥锁上的“释放”操作实际上可能不会解锁它,因此在释放后等待可能会死锁。您想要一种方法来执行此操作这一事实强烈表明您的设计或您对条件变量的理解存在问题。
想一想——当一个持有递归互斥锁的函数调用一个获取第二个锁的函数然后调用睡眠函数时会发生什么?如果锁被释放,第一个函数的逻辑将中断,因为对象将在它持有锁的同时被修改。如果锁没有被释放,等待将死锁,因为它正在等待的事情永远不会发生,因为它持有另一个线程需要让它发生的锁。
在不知道您是否已经锁定条件变量的情况下,没有明智的方法来使用条件变量。如果你知道你是否有锁,就不需要递归锁功能。如果你知道你已经有一个锁,不要费心调用锁函数。如果您知道您还没有锁,即使它不是递归的,锁功能也可以正常工作。