C++ C++\Win32混淆了WaitForSingleObject函数返回值的含义

C++ C++\Win32混淆了WaitForSingleObject函数返回值的含义,c++,multithreading,winapi,mutex,C++,Multithreading,Winapi,Mutex,我使用CreateMutex创建了一个互斥体,然后我使用WaitForSingleObject在某个线程上等待,直到释放互斥体并获得它的所有权(没有超时) 因此,如果函数返回WAIT\u OBJECT\u 0,我就可以继续执行线程的代码 但是,如果函数返回WAIT_dependent,我是否仍然可以执行该代码,并期望在我的互斥锁上调用WaitForSingleObject的任何其他线程都会被卡住,直到我释放 如果拥有线程终止而不释放互斥锁,我希望调用线程获得所有权,一切照常进行 编辑:让我感

我使用
CreateMutex
创建了一个互斥体,然后我使用
WaitForSingleObject
在某个线程上等待,直到释放互斥体并获得它的所有权(没有超时)

因此,如果函数返回
WAIT\u OBJECT\u 0
,我就可以继续执行线程的代码

但是,如果函数返回
WAIT_dependent
,我是否仍然可以执行该代码,并期望在我的互斥锁上调用
WaitForSingleObject
的任何其他线程都会被卡住,直到我释放


如果拥有线程终止而不释放互斥锁,我希望调用线程获得所有权,一切照常进行



编辑:让我感到困惑的是,MSDN说情况(2)中互斥的状态是未标记的,与状态(1)相反。这对我意味着什么?

如果你得到了
等待
的回报,那意味着你已经拥有了互斥锁。问题是您不知道受其保护的资源的状态


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

放弃等待意味着你的代码中有一个相当严重的问题。当一个线程拥有一个互斥体,但它在没有调用ReleaseMutex()的情况下终止时,您将得到此状态代码


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

这里的有用信息:在我的特殊情况下,由于线程所做工作的性质,我不关心资源的状态。但是我读到这也意味着互斥体的状态是“unsignaled”而不是返回前一个值时的“signaled”状态。然而,在不太可能发生这种情况的情况下,我仍然不关心资源的状态,因为我的线程无论如何都可以处理其所有可能的状态。