【问题标题】:C++\Win32 Confused about WaitForSingleObject function return value meaningC++\Win32对WaitForSingleObject函数返回值含义的困惑
【发布时间】:2012-08-09 17:49:11
【问题描述】:

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

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

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


如果拥有线程在没有释放 Mutex 的情况下终止,我希望调用线程获得所有权并且一切照常进行。


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

【问题讨论】:

标签: c++ multithreading winapi mutex


【解决方案1】:

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

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

【讨论】:

  • 在我的特殊情况下,由于线程的工作性质,我不关心资源的状态。但我读到这也意味着 Mutex 的状态是“未发出信号”与返回前一个值时所处的“发出信号”状态。
【解决方案2】:

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

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

【讨论】:

  • 你说得有道理,我打算添加一些代码来优雅地终止线程,这样就不会发生这种情况。然而,在这种不太可能发生的情况下,我仍然不关心资源的状态,因为我的线程无论如何都可以处理它所有可能的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多