【问题标题】:Why would WaitForSingleObject return WAIT_FAILED为什么 WaitForSingleObject 会返回 WAIT_FAILED
【发布时间】:2010-09-17 16:00:38
【问题描述】:

MSDN 说

如果函数失败,返回值为WAIT_FAILED。要获取扩展的错误信息,请调用 GetLastError。

代码是:

HANDLE     m_mutex_handle;    /**< m_mutex_handle. The handle to the created mutex. */
m_mutex_handle = ::CreateMutex( 0, false, NULL );
::WaitForSingleObject( m_mutex_handle, INFINITE );

但是可能发生的原因是什么?

【问题讨论】:

  • 那么,GetLastError() 返回什么?这通常会给你一个很好的线索。

标签: windows winapi mutex


【解决方案1】:

如果您缺少对象的 SYNCHRONIZE 权限,那么您不能等待。将返回 WAIT_FAILED。

【讨论】:

    【解决方案2】:

    传入一个伪造的对象可能会导致这种情况。

    【讨论】:

    • 传入一个 seriously 虚假对象甚至可能导致未定义的行为,但也许该函数会检查这些情况。 :-P
    【解决方案3】:

    在等待句柄时关闭句柄也会导致未定义的行为。

    【讨论】:

      【解决方案4】:

      当传入线程句柄数组时,我从 WaitForMultipleObjects 获得了 WAIT_FAILED,因为其中一个是伪句柄。正如不朽的 Raymond Chen 所解释的那样,并提供了修复:https://devblogs.microsoft.com/oldnewthing/20141015-00/?p=43843

      【讨论】:

      • 如果您正在查看这个问题,您应该阅读上面链接的 Raymond Chen 的博客文章。基本上不是所有的句柄都是句柄,有些是特殊的占位符“伪句柄”,不是绝对值。
      猜你喜欢
      • 1970-01-01
      • 2013-02-19
      • 2011-04-26
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2013-06-05
      相关资源
      最近更新 更多