6
votes

MSDN says

If the function fails, the return value is WAIT_FAILED. To get extended error information, call GetLastError.

The code is:

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 );

But what are the reasons that could happen?

4
So, what does GetLastError() return? That usually gives you a pretty good clue. - Ferruccio

4 Answers

7
votes

If you lack the SYNCHRONIZE privilege on the object, then you cannot wait. WAIT_FAILED will be returned.

4
votes

Passing in a bogus object might cause that.

1
votes

Closing a handle while the handle is being waited on can also cause undefined behaviour.

1
votes

I got WAIT_FAILED from WaitForMultipleObjects when passing in an array of thread handles as one of them was a pseudo handle. As ever the immortal Raymond Chen explained, and provided the fix: https://devblogs.microsoft.com/oldnewthing/20141015-00/?p=43843