ManualResetEvent와 ManualResetEventSlim은 .NET에서 스레드 동기화를 위해 사용되는 클래스입니다. 이 클래스들은 이벤트 기반 동기화 메커니즘으로, 한 스레드가 다른 스레드에 작업을 시작하거나 계속 진행할 수 있는 신호를 보낼 때 사용됩니다.
ManualResetEvent의 기본 동작
기본 개념
ManualResetEvent는 이벤트 객체를 생성하여 신호를 설정하거나 재설정Set/Reset할 수 있습니다.
신호가 설정되면Set, 기다리고 있던 모든 스레드가 작업을 시작합니다.
신호를 재설정Reset하면 다시 대기 상태로 돌아갑니다.
주요 메서드
Set(): 신호를 설정하여, 대기 중인 스레드들이 계속 실행되도록 합니다.
Reset(): 신호를 재설정하여, 이후의 스레드들이 대기 상태에 머물도록 합니다.
WaitOne(): 현재 스레드가 신호가 설정될 때까지 기다립니다.
구현 예
ManualResetEvent mre = new ManualResetEvent(false); // 초기 신호 상태: 비설정(false)Task.Run(() =>
{
Console.WriteLine("작업 중... 신호 대기 중");
mre.WaitOne(); // 신호를 대기 Console.WriteLine("신호 수신! 작업 재개");
});
Thread.Sleep(2000); // 2초 후 신호 전송mre.Set(); // 신호 설정// 작업 중... 신호 대기 중// (2초 대기)// 신호 수신! 작업 재개
내부적으로 스핀 대기spin-waiting를 사용하여, 잠깐 동안 신호를 기다릴 때 더 적은 리소스를 사용합니다.
짧은 대기 시간에 적합합니다.
주요 차이점
특징
ManualResetEvent
ManualResetEventSlim
기본 사용
커널 객체를 사용한 스레드 동기화
사용자 모드에서 실행, 경량화된 동기화
스핀 대기(Spin-Waiting)
없음
짧은 시간 대기를 위해 스핀 대기 사용
성능
대기 시간이 길거나 많은 스레드에 적합
짧은 대기 시간 또는 적은 스레드에 적합
리소스 사용량
더 많은 메모리와 CPU 사용
더 적은 메모리와 CPU 사용
동기화 메커니즘
커널 수준 신호 (Windows 이벤트 핸들)
사용자 수준 신호
Wait 메서드의 타임아웃 지원
지원
지원
구현 예
ManualResetEventSlim mreSlim = new ManualResetEventSlim(false);
Task.Run(() =>
{
Console.WriteLine("작업 중... 신호 대기 중");
mreSlim.Wait(); // 신호를 대기 Console.WriteLine("신호 수신! 작업 재개");
});
Thread.Sleep(2000); // 2초 후 신호 전송mreSlim.Set(); // 신호 설정// 작업 중... 신호 대기 중// (2초 대기)// 신호 수신! 작업 재개