2012-10-11 51 views
0

据我所知,在Windows上CRITICAL_SECTION只能用作非递归互斥量。要获得递归互斥锁,你必须使用OpenMutex和朋友。Windows上的递归互斥?

然而,AFAIU,Win32的互斥锁不能与条件变量使用(InitializeConditionVariable等)

有没有结合在Windows上使用递归互斥体与条件变量的方法吗?

+1

你明白错误。关键部分(就互斥体而言)**可以**递归使用。 – valdo

回答

4

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

0

这只是没有任何意义。从语义上讲,条件变量的意义在于,当你等待时你可以原子地释放锁 - 从而允许其他线程获取锁来执行你正在等待的东西。然而,递归互斥体上的“释放”操作可能实际上并未解锁它,因此在发布后等待可能会死锁。事实上,你想要一种方式来强有力地表明你的设计或你对条件变量的理解有些问题。

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

有使用条件变量不知道你是否就可以有一个锁已经没有合理的方式。如果你知道你是否有锁,那就不需要递归锁定功能。如果你知道你已经有一个锁,不要打扰调用锁定功能。如果你知道你还没有锁,即使它不是递归的,锁功能也可以正常工作。

+0

在我的用例中,只有在等待完成后才会对互斥量进行递归访问。因此没有问题。 –

+0

由于您正在跟踪何时递归使用互斥体,何时不使用互斥体,因此不需要递归互斥体。当您递归使用它时,只需不要打扰调用锁定/解锁功能。 –

+0

我将不得不在某处存储状态(递归与非递归)。这个存储本身必须抵抗多线程的同时访问。这将意味着使用原子。等太复杂。如上所述,CRITICAL_SECTION *是*递归的,所以没问题。无论如何感谢您的帮助! –