Microsoft文档没有说明如果互斥锁已经解锁时我错误地调用ReleaseMutex()
会发生什么。
详细信息:
我试图在不访问编译器的情况下修复一些Windows代码。
我意识到WinApi互斥锁都是递归的,并且是引用计数的。如果使用该功能,很明显,额外的ReleaseMutex()
调用会过早地减少引用计数器。
但是,我正在查看的代码不会递归使用互斥体,因此引用计数永远不会高于“1”。 释放互斥锁的次数是否超过了的时间……那么会发生什么呢?引用计数是否为负?它是否保持零(未锁定)并且仅返回可忽略的错误?
(自然,此代码在调用这些函数时实际上并不检查错误!)
最佳答案
peejay在他对ReleaseMutex documentation的评论中提供了很好的链接。我相信文档中的这一行可以回答您的问题:
虽然没有明确说明,但我认为(首次)释放互斥锁会导致调用线程不再拥有该互斥锁对象。因此,第二个调用将完全失败。这样的实现也很有意义,因为它可以轻松检测到这种类型的错误(只需检查返回值)。