6

WarumWarum blockiert WaitForSingleObject (INVALID_HANDLE_VALUE, INFINITE)?

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

Block? Es wird nicht mit einer Fehlermeldung zurückgegeben. Das Handle für INVALID_HANDLE zu überprüfen wäre dumm für einen Mutex, da ich einen Mutex für den Zugriff auf das Mutex-Handle benötigen würde ...

BTW: Es kommt mit WAIT_FAILED zurück, wenn der Griff geschlossen war.

Antwort

16

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

Viertens müssen Sie mit dem INVALID_HANDLE_VALUE Wert besonders vorsichtig sein: Durch Zufall der Wert INVALID_HANDLE_VALUE numerisch gleich den Pseudohandle von GetCurrentProcess() zurückgegeben werden passiert. Viele Kernel-Funktionen akzeptieren Pseudo-Handles. Wenn Sie also versagen und versehentlich WaitForSingleObject auf einem fehlerhaften INVALID_HANDLE_VALUE-Handle aufrufen, werden Sie tatsächlich auf Ihren eigenen Prozess warten. Diese Wartezeit wird natürlich niemals abgeschlossen, da ein Prozess beim Beenden signalisiert wird, so dass Sie auf sich selbst warten mussten.

+1

Ich denke, ich fühle mich jetzt krank ... Also muss ich den alten Griff um und signalisieren Gültigkeit mit einer separaten Flagge. Warum heißt das nicht in der Dokumentation? – EricSchaefer

+3

Ich würde 'WaitForSingleObject' einpacken und' WAIT_FAILED' für 'INVALID_HANDLE_VALUE' zurückgeben, es wird wahrscheinlich weniger Programmierung erfordern. –