ManualResetEvent는
C#에서 스레드 동기화를 위해 사용되는 동기화 프리미티브 중 하나입니다.
이는 신호 메커니즘을 제공하여 하나의 스레드가 다른 하나 이상의 스레드를 대기 상태에서 해제할 수 있도록 합니다.
ManualResetEvent의 상태는 수동으로 변경되어야 합니다
즉, Set() 메서드를 호출하면 이벤트 상태가 신호 상태로 설정되고,
Reset() 메서드를 호출하면 비신호 상태로 재설정됩니다.
이 메커니즘은 특정 이벤트가 발생할 때까지 하나 이상의 스레드가 대기하도록 할 때 유용합니다.
예를 들어, 어떤 리소스가 준비되거나 작업이 완료될 때까지 여러 스레드를 차단해야 할 경우에
ManualResetEvent를 사용할 수 있습니다.
C# 예제입니다.
using System;
using System.Threading;
class Program
{
// ManualResetEvent 인스턴스 생성 (초기 상태는 비신호)
private static ManualResetEvent manualEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("Starting two operations...");
// 두 개의 스레드 시작
new Thread(DoWork).Start("Operation 1");
new Thread(DoWork).Start("Operation 2");
// 모든 작업이 완료될 때까지 대기
Console.WriteLine("Waiting for operations to finish...");
manualEvent.WaitOne(); // 이벤트의 신호를 기다림
Console.WriteLine("All operations completed.");
}
static void DoWork(object data)
{
string name = (string)data;
// 가상의 작업 수행 (여기서는 단순히 대기)
Console.WriteLine($"{name} starting...");
Thread.Sleep(new Random().Next(2000, 5000)); // 임의의 시간 대기
Console.WriteLine($"{name} completed.");
// 이벤트를 신호 상태로 설정 (모든 스레드 해제)
manualEvent.Set();
}
}
AutoResetEvent와의 차이점
- 동작 모드: ManualResetEvent는 Set() 호출 후 수동으로 리셋할 때까지 여러 스레드가 깨어날 수 있습니다. AutoResetEvent는 Set() 호출 후 자동으로 리셋되며, 이로 인해 오직 하나의 스레드만 깨어납니다.
- 사용 사례: ManualResetEvent는 여러 스레드가 동시에 진행해야 하는 작업이 있을 때 유용합니다. 예를 들어, 여러 스레드가 동시에 시작해야 하는 시나리오에서 사용될 수 있습니다. 반면, AutoResetEvent는 순차적인 작업 처리가 필요할 때, 즉 하나의 스레드만 특정 시점에 작업을 수행해야 할 때 유용합니다.
이러한 차이점으로 인해 ManualResetEvent와 AutoResetEvent는 서로 다른 시나리오에 적합합니다. 따라서 어떤 이벤트를 사용할지 결정할 때는 애플리케이션의 요구 사항과 스레드 동기화의 특정 측면을 고려해야 합니다.
LIST
'멀티쓰레드 프로그래밍' 카테고리의 다른 글
Thread Local Storage (0) | 2024.02.27 |
---|---|
ReaderWriterLock (0) | 2024.02.27 |
AutoResetEvent (0) | 2024.02.26 |
Context Switching (0) | 2024.02.26 |
SpinLock (0) | 2024.02.23 |