더북(TheBook)

그러나 이 프로그램의 실행 결과는 기대와 다를 것입니다. 이벤트 상태 값을 0으로 바꾸는 것은 모든 스레드가 이벤트 대기에서 깨어난 이후에만 할 수 있는데, 그 시점을 알 수가 없습니다. 따라서 실제로는 모든 스레드가 깨어나기도 하고 운이 없으면 일부 스레드만 깨어납니다. 결과를 특정할 수 없다는 의미입니다.

이 경우를 대비하여 이벤트에 맥박(pulse) 기능도 있습니다. 이벤트에 딱 1회만 상태 값을 1로 바꾸고 즉시 다시 0으로 바꾸는 기능입니다. 수동 이벤트에 맥박 1회를 주면 수동 이벤트라고 하더라도 상태 값이 1이 되었다가 즉시 0으로 다시 바뀝니다. 이때 스레드 둘 이상이 이벤트를 기다리고 있으면 모든 스레드가 성공적으로 깨어납니다.

Event event1;
 
void Thread1()
{
  // 이벤트가 신호를 일으킬 때까지 기다린다.
  event1.Wait();
}
 
void Thread2()
{
  // 이벤트가 신호를 일으킬 때까지 기다린다.
  event1.Wait();
}
 
void Thread3()
{
  // 이벤트에 맥박 신호를 준다.
  event1.PulseEvent();
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.