2008-10-17 124 views
4

MSDN说为什么WaitForSingleObject的返回WAIT_FAILED

如果函数调用失败,返回值为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); 

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

+2

那么,GetLastError()返回什么?这通常会给你一个很好的线索。 – Ferruccio 2008-10-17 01:22:35

回答

4

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

+0

传入一个_seriously_伪造对象甚至可能导致未定义的行为,但也许函数检查这些情况。 :-P – 2008-10-17 00:43:17

1

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

7

如果您在对象上缺少SYNCHRONIZE权限,则无法等待。 WAIT_FAILED将被退回。

1

当传递一个线程句柄数组时,我从WaitForMultipleObjects中获得了WAIT_FAILED,因为它们中的一个是伪句柄。不朽的雷蒙德陈解释,并提供修复:https://blogs.msdn.microsoft.com/oldnewthing/20141015-00/?p=43843

+0

如果你正在看这个问题,你应该阅读上面链接的Raymond Chen的博客文章。基本上不是所有的手柄都是手柄,有些是特殊的占位符“假手柄”,并不是绝对值。 – 2017-03-12 02:16:01