2012-03-19 8 views
6

Ho un ciclo di eventi che è in attesa di diversi eventi di reset automatico. Gli eventi sono stati tutti inizializzati nell'array eventHandles_ con CreateEvent(NULL, false, false, NULL).WaitForMultipleObjects() reimposta tutti gli eventi di reset automatico?

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... 
    } 
} 

La mia domanda: se l'evento 1 e 2 si verificano contemporaneamente, il ciclo elaborerà WAIT_OBJECT_0 + 1 perché è primo. Ma l'evento 2 rimarrà segnalato quando il ciclo si ripresenta? O viene ripristinato automaticamente?

+1

In generale, è meglio cercare di evitare tali costrutti. Avrei ogni thread di segnalazione spingere un indice adatto, delegare o qualsiasi cosa su una coda thread-safe e segnalare un singolo semaforo. Questo disegna attorno al problema - il comportamento è del tutto noto e prevedibile, nessun evento andrà mai perso anche se un thread segnala più di una volta, non c'è una restrizione di 64 handle e il numero di thing di segnalazione non è fisso in fase di compilazione. –

risposta

5

"... modifica avviene solo per l'oggetto o gli oggetti il ​​cui stato segnalato causato la funzione per restituire ..."

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

E dalla bocca di uno Raymond Chen:

Se si attende un evento, allora solo quell'evento viene modificato. Se stai aspettando per tutti gli eventi, allora tutti sono modificati. Questo è ciò che la documentazione significa per "oggetto o oggetto". Singolare se aspettare-qualsiasi, plurale se wait-all.

Problemi correlati