2012-03-19 7 views
6

Tengo un bucle de evento que está esperando en varios eventos de restablecimiento automático. Todos los eventos se inicializaron en la matriz eventHandles_ con CreateEvent(NULL, false, false, NULL).¿WaitForMultipleObjects() restablece todos los eventos de restablecimiento automático?

while (true) 
{ 
    DWORD waitResult = WaitForMultipleObjects(3, eventHandles_, false, INFINITE); 
    switch (waitResult) 
    { 
    case WAIT_OBJECT_0 + 0: 
     //handle event... 

    case WAIT_OBJECT_0 + 1: 
     //handle event... 

    case WAIT_OBJECT_0 + 2: 
     //handle event... 
    } 
} 

Mi pregunta: si el evento 1 y 2 ocurren simultáneamente, el bucle procesará WAIT_OBJECT_0 + 1 porque es primero. ¿Pero el evento 2 permanecerá señalizado cuando el ciclo vuelva a aparecer? ¿O se restablece automáticamente?

+1

En general, es mejor tratar de evitar tales construcciones. Me gustaría que cada hilo de señalización insertara un índice adecuado, delegue o lo que sea en una cola segura para hilos y señale un solo semáforo. Esto se diseña en torno al problema: el comportamiento es totalmente conocido y predecible, ningún evento se perderá jamás, incluso si un hilo se señaliza más de una vez, no hay restricciones de 64 manejadores y el número de puntos de señalización no está fijo en tiempo de compilación. –

Respuesta

5

"... modificación se produce sólo para el objeto u objetos cuyo estado señalado causado la función para volver ..."

http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx

Y de la boca de uno Raymond Chen:

Si está esperando un evento, solo se modifica ese evento. Si espera para todos los eventos, entonces todos son modificados. Eso es lo que la documentación significa por "objeto u objetos". Singular si espera-any, plural si espera-todo.

Cuestiones relacionadas