2008-10-17 6 views
4

MSDN ditPourquoi y aurait-WaitForSingleObject revenir WAIT_FAILED

Si la fonction échoue, la valeur de retour est WAIT_FAILED. Pour obtenir des informations d'erreur étendues, appelez GetLastError.

Le code est:

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

Mais quelles sont les raisons qui pourraient se produire?

+2

Alors, qu'est-ce que GetLastError() retourne? Cela vous donne généralement une bonne idée. – Ferruccio

Répondre

4

Passer dans un objet bidon peut en être la cause.

+0

Passer dans un objet _seriously_ bidon peut même provoquer un comportement indéfini, mais peut-être que la fonction vérifie ces cas. :-P –

1

La fermeture d'une poignée pendant l'attente de la poignée peut également provoquer un comportement indéfini.

7

Si vous ne disposez pas du privilège SYNCHRONIZE sur l'objet, vous ne pouvez pas attendre. WAIT_FAILED sera retourné.

1

J'ai obtenu WAIT_FAILED de WaitForMultipleObjects lors du passage dans un tableau de handles de threads comme l'un d'eux était un pseudo-handle. Comme toujours l'immortel Raymond Chen a expliqué, et fourni le correctif: https://blogs.msdn.microsoft.com/oldnewthing/20141015-00/?p=43843

+0

Si vous regardez cette question, vous devriez lire l'article de blog de Raymond Chen lié ci-dessus. Fondamentalement, toutes les poignées ne sont pas des poignées, certaines sont des poignées spéciales de pseudos et ne sont pas des valeurs absolues. –

Questions connexes