6

PourquoiPourquoi WaitForSingleObject (INVALID_HANDLE_VALUE, INFINITE) bloque-t-il?

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

bloc? Il ne retourne pas avec un message d'erreur. Vérifier la poignée pour INVALID_HANDLE serait stupide pour un mutex car j'aurais besoin d'un mutex pour accéder à la poignée de mutex ...

BTW: Il revient avec WAIT_FAILED si la poignée était fermée.

Répondre

16

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

Quatrièmement, vous devez être particulièrement prudent avec la valeur INVALID_HANDLE_VALUE: Par hasard, la valeur INVALID_HANDLE_VALUE se trouve être numériquement égale à la pseudohandle retournée par GetCurrentProcess(). De nombreuses fonctions du noyau acceptent les pseudo-handles, donc si vous vous trompez et que vous appelez accidentellement, par exemple, WaitForSingleObject sur une poignée INVALID_HANDLE_VALUE qui a échoué, vous finirez par attendre votre propre processus. Cette attente, bien sûr, ne sera jamais complète, car un processus est signalé quand il se termine, alors vous avez fini par attendre.

+1

Je pense que je me sens mal maintenant ... Donc je dois garder l'ancienne poignée et signaler la validité avec un drapeau séparé. Pourquoi la documentation ne le dit-elle pas ... – EricSchaefer

+3

J'emballe 'WaitForSingleObject' et renvoie' WAIT_FAILED' pour 'INVALID_HANDLE_VALUE', cela prendra probablement moins de code. –

Questions connexes