when a thread in the handle array becomes signalled and the wait satisfied, handle the case and then remove that handle from the array (dec. the count, shift over remaining handles as required..) That handle will remain valid and signalled until you call CloseHandle on it, so you must remove it from the wait.