Закройте дескриптор, когда все потоки закончили использовать его.После того, как WaitForSingleObject покажется мне разумным (потому что, если это удастся, SetEvent должен завершиться).
В качестве альтернативы - дайте каждому потоку свою собственную копию дескриптора (например, через DuplicateHandle), и каждый из них должен закрыть свою копию, когдазакончилиГораздо сложнее ошибиться и требует меньше анализа кода.