Почему WaitForSingleObject возвращает WAIT_FAILED

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

Но по каким причинам это могло произойти?


person mat_geek    schedule 17.10.2008    source источник
comment
Итак, что возвращает GetLastError()? Обычно это дает вам довольно хорошую подсказку.   -  person Ferruccio    schedule 17.10.2008


Ответы (4)


Если у вас нет привилегии SYNCHRONIZE для объекта, вы не можете ждать. WAIT_FAILED будет возвращен.

person 1800 INFORMATION    schedule 17.10.2008

Это может быть вызвано передачей поддельного объекта.

person Community    schedule 17.10.2008
comment
Передача серьезно поддельного объекта может даже привести к неопределенному поведению, но, возможно, функция проверяет такие случаи. :-П - person Chris Jester-Young; 17.10.2008

Закрытие дескриптора во время ожидания дескриптора также может привести к неопределенному поведению.

person Windows programmer    schedule 17.10.2008

Я получил WAIT_FAILED от WaitForMultipleObjects при передаче массива дескрипторов потоков, поскольку один из них был псевдодескриптором. Как всегда бессмертный Рэймонд Чен объяснил и предоставил исправление: https://blogs.msdn.microsoft.com/oldnewthing/20141015-00/?p=43843

person osullivj    schedule 14.12.2016
comment
Если вы смотрите на этот вопрос, вы должны прочитать сообщение в блоге Раймонда Чена, указанное выше. В основном не все дескрипторы являются дескрипторами, некоторые из них являются специальными заполнителями «псевдо-дескрипторы» и не являются абсолютными значениями. - person mat_geek; 12.03.2017