2

我有一个用 创建的互斥锁CreateMutex,然后我WaitForSingleObject用来等待某个线程,直到互斥锁被释放并获得它的所有权(没有超时)。

所以,如果函数返回WAIT_OBJECT_0,我可以继续我的婚姻方式并执行线程的代码。

但是,如果函数返回WAIT_ABANDONED,我是否仍然可以执行代码,期望调用WaitForSingleObject我的 Mutex 的任何其他线程都会卡住,直到我释放?


如果拥有线程在没有释放互斥锁的情况下终止,我希望调用线程获得所有权并且事情继续照常进行。


编辑:让我感到困惑的是,MSDN 说在情况(2)中互斥锁的状态是未发出信号的,因为它与发出信号的状态(1)相反。这对我意味着什么?

4

2 回答 2

1

如果你WAIT_ABANDONED回来了,这意味着你已经获得了互斥锁的所有权。问题是您不知道受它保护的资源的状态。

例如,假设线程 X 获得一个互斥体并开始操作受该互斥体保护的事物的状态,然后被杀死。状态未知,互斥锁未持有。当你去等待那个互斥体时,你会收到它,但你不会知道那个状态。

于 2012-08-09T17:52:29.807 回答
1

获得 WAIT_ABANDONED 表明您的代码中存在相当严重的问题。当一个线程拥有一个互斥体但它在​​没有调用 ReleaseMutex() 的情况下终止时,您将获得此状态代码。

这可能是您的代码中的一个简单错误,只是忘记调用该函数。这可能是一些非常讨厌的事情的迹象,线程因异常而死并吞下了它。但是没有正确清理状态,包括忘记释放互斥锁。在没有清理的情况下吞下异常总是一个令人讨厌的错误生成器,它会使程序无法预测和无法诊断地失败。

于 2012-08-09T18:08:06.313 回答