9

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

细节:

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

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

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

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

4

1 回答 1

8

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

如果调用线程不拥有互斥对象,则 ReleaseMutex 函数将失败。

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

于 2009-09-29T15:09:32.650 回答