如果我ReleaseMutex()两次会怎么样?

时间:2009-09-29 14:43:05

标签: c++ multithreading winapi mutex

如果我在互斥锁已经解锁时错误地调用ReleaseMutex(),那么Microsoft文档没有提及会发生什么。

详细信息:

我正在尝试修复一些Windows代码而无法访问编译器。

我意识到WinApi互斥体都是递归的,并且是引用计数的。如果我正在使用该功能,那么额外的ReleaseMutex()调用显然会过早地减少参考计数器。

但是,我正在查看的代码不会递归使用互斥锁,因此引用计数永远不会高于“1”。 确实释放互斥锁的次数超过了必要...所以会发生什么?引用计数是否为负数?它是否保持零(解锁)并且只返回一个可忽略的错误?

(当然,这段代码在调用这些函数时实际上并没有检查错误!)

1 个答案:

答案 0 :(得分:8)

peejay在他对ReleaseMutex documentation的评论中提供了一个很好的链接。我相信文档中的这一行可以回答您的问题:

  

如果,则ReleaseMutex功能失败   调用线程不拥有互斥锁   对象

虽然没有明确说明,但我认为释放互斥锁(第一次)会导致调用线程不再拥有互斥锁对象。因此,第二次通话将失败。这样的实现也很有意义,因为它可以轻松检测到这种类型的错误(只需检查返回值)。