【发布时间】:2010-12-02 08:31:48
【问题描述】:
如果我在互斥锁已解锁时错误地调用 ReleaseMutex() 会发生什么,Microsoft 文档只字未提。
详情:
我正在尝试在无法访问编译器的情况下修复一些 Windows 代码。
我意识到 WinApi 互斥锁都是递归的,并且是引用计数的。如果我使用该功能,很明显额外的ReleaseMutex() 调用会过早地减少引用计数器。
但是,我正在查看的代码不会递归地使用互斥锁,因此引用计数永远不会高于“1”。它确实释放互斥锁的次数超过了必要的次数......那么会发生什么?引用计数是否为负数?它是否保持为零(解锁)并且只返回一个可忽略的错误?
(当然,这段代码在调用这些函数时实际上并不检查错误!)
【问题讨论】:
-
这是一个非常糟糕的问题。即使我知道,“它在 WinXP 下检查”在 Win7 下也可能完全不同。所以你真的不应该这样做。 (注意:我认为它已被选中)
-
peejaybee,您应该将该评论升级为答案!
-
上面链接的微软文档页面看起来很清楚:如果您在没有先获取互斥锁的情况下在互斥锁上调用 ReleaseMutex(),则调用将失败而没有任何副作用。也就是说,不依赖这种行为可能是明智的;相反,您应该确保您的代码始终将其互斥锁发布与其互斥锁获取相匹配。侮辱那些试图在他们自己的时间免费帮助你的人也是相当糟糕的形式。
标签: c++ multithreading winapi mutex