Почему 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
справиться, вы на самом деле в конечном итоге ждать своего собственного процесса. Это ожидание, конечно, никогда не завершится, потому что процесс сигнализирует о его завершении, поэтому вы в конечном итоге ожидаете себя.