ManualResetEvent vs ManualResetEventSlim vs AutoResetEvent

재설정 이벤트에는 System.Threading.ManualResetEvent와 닷넷 프레임워크 4에서 추가된 간략 형태인 System.Threading.ManualResetEventSlim이 있다. 재설정 이벤트에서 제공하는 중요 메소드에는 Set() Wait()(ManualResetEvent에는 WaitOne())가 있다. Wait() 메소드를 호출하면 다른 스레드에서 Set()을 호출하거나 지정한 대기 시간이 끝날 때 까지 해당 스레드를 차단할 것이다.

ManualResetEventSlimManualResetEvent의 차이점은 후자의 경우 기본적으로 커널 동기화를 사용하도록 되어 있는 방면 전자는 피치 못할 경우를 제외하고는 커널을 통하지 않도록 최적화되어 있다. 따라서 ManualResetEventSlim이 더 많은 CPU 사이클을 사용할 가능성이 있지만 더 우수한 성능을 나타낸다. 그러므로 여러 개의 이벤트를 대기하거나 프로세스간 대기와 같은 요구가 없는 일반적인 경우에는 ManualResetEventSlim을 사용하자.

 System.Threading.AutoResetEvent라는 세 번째 재설정 이벤트가 있는데, 이것도 ManualResetEvent와 마찬가지로 스레드가 코드 상의 특정 위치까지 진행앴음을 다른 스레드에 신호(Set() 호출로 전달) 할 수 있게 해 준다. 차이점은 AutoResetEvent의 경우 신호를 받은 첫 번째 스레드가 자동 재설정 게이트를 통과하면 자동으로 다시 잠금이 설정되기 때문에 단 하나의 스레드만 차단해제한다는 것이다. 하지만 이와 같은 자동 재설정 이벤트를 사용할 때 생산자 스레드가 실수로 소비자 스레드의 개수보다 더 많은 반복을 할 위험성이 너무 쉽게 노출된다. 그러므로 일반적으로 Monitor Wait() / Pulse() 패턴 혹은 세마포어의 사용이 권장된다(특정 블록에 대해 참여할 수 있는 스레드가 n개보다 작은 경우). AutoResetEvent와 대조적으로 ManualResetEvent의 경우에는 Reset()을 명시적으로 호출하지 않으면 설정되기 전 상태(신호를 보내기 전)로 되돌아가지 않는다.

 

 - Essential C# 5.0 (C#의 기초와 고급을 아우르는 핵심 바이블) - 18장 다중 스레딩

 

+ Recent posts