그러나 이 프로그램의 실행 결과는 기대와 다를 것입니다. 이벤트 상태 값을 0으로 바꾸는 것은 모든 스레드가 이벤트 대기에서 깨어난 이후에만 할 수 있는데, 그 시점을 알 수가 없습니다. 따라서 실제로는 모든 스레드가 깨어나기도 하고 운이 없으면 일부 스레드만 깨어납니다. 결과를 특정할 수 없다는 의미입니다.
이 경우를 대비하여 이벤트에 맥박(pulse) 기능도 있습니다. 이벤트에 딱 1회만 상태 값을 1로 바꾸고 즉시 다시 0으로 바꾸는 기능입니다. 수동 이벤트에 맥박 1회를 주면 수동 이벤트라고 하더라도 상태 값이 1이 되었다가 즉시 0으로 다시 바뀝니다. 이때 스레드 둘 이상이 이벤트를 기다리고 있으면 모든 스레드가 성공적으로 깨어납니다.
Event event1; void Thread1() { // 이벤트가 신호를 일으킬 때까지 기다린다. event1.Wait(); } void Thread2() { // 이벤트가 신호를 일으킬 때까지 기다린다. event1.Wait(); } void Thread3() { // 이벤트에 맥박 신호를 준다. event1.PulseEvent(); }