C ++ \ Win32关于WaitForSingleObject函数返回值的含义

时间:2012-08-09 17:49:12

标签: c++ multithreading winapi mutex

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

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

但是,如果函数返回WAIT_ABANDONED,我是否仍然可以执行代码,期望在我的Mutex上调用WaitForSingleObject的任何其他线程在我发布之前都会被卡住?


如果拥有的线程在没有释放Mutex的情况下终止,我希望调用线程获得所有权以及继续正常运行的事情。


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

2 个答案:

答案 0 :(得分:1)

如果您返回WAIT_ABANDONED,则表示您已获得互斥锁的所有权。问题是您不知道受其保护的资源的状态。

例如,假设Thread X获取一个互斥锁并开始操纵受该互斥锁保护的某些东西的状态,然后被杀死。状态未知,互斥锁未被保留。当你在那个互斥锁上等待时,你会收到它,但你不会知道那个状态。

答案 1 :(得分:1)

获取WAIT_ABANDONED表示代码中存在相当严重的问题。当一个线程拥有一个互斥锁但它终止而没有调用ReleaseMutex()时,你会得到这个状态码。

这可能是您代码中的一个简单错误,只是忘记调用该函数。它可能是真正讨厌的东西的标志,线程在异常中死亡并吞噬它。但没有正确清理状态,包括忘记释放互斥锁。吞没异常而不进行清理总是一个令人讨厌的错误生成器,它使程序无法预测且无法识别。