Почему WaitForSingleObject(INVALID_HANDLE_VALUE, INFINITE) блокируется?

Почему

HANDLE mutexHandle = INVALID_HANDLE_VALUE;
WaitForSingleObject(mutexHandle, INFINITE);

блок? Не возвращается с сообщением об ошибке. Проверка ручки для INVALID_HANDLE было бы глупо для мьютекса, так как мне нужен мьютекс для доступа к дескриптору мьютекса...

Кстати: он возвращается с WAIT_FAILED если ручка была закрыта.

1 ответ

Решение

С http://blogs.msdn.com/oldnewthing/archive/2004/03/02/82639.aspx:

В-четвертых, вы должны быть особенно осторожны с INVALID_HANDLE_VALUE значение: по совпадению, значение INVALID_HANDLE_VALUE оказывается численно равным псевдообращению, возвращаемому GetCurrentProcess(), Многие функции ядра принимают псевдо-дескрипторы, поэтому, если вы запутались и случайно вызвали, скажем, WaitForSingleObject на неудачу INVALID_HANDLE_VALUE справиться, вы на самом деле в конечном итоге ждать своего собственного процесса. Это ожидание, конечно, никогда не завершится, потому что процесс сигнализирует о его завершении, поэтому вы в конечном итоге ожидаете себя.

Другие вопросы по тегам