AutoResetEvent는
C#에서 스레드 간 동기화를 위해 사용되는 동기화 프리미티브 중 하나입니다.
이는 주로 이벤트 신호 상태를 자동으로 관리하여,
한 스레드가 다른 스레드에 작업 완료, 리소스 사용 가능 등의 신호를 보낼 때 사용됩니다.
AutoResetEvent 객체는 두 가지 상태, 즉 신호 상태(signaled)와 비신호 상태(non-signaled)를 가집니다.
- 신호 상태(Signaled): AutoResetEvent가 신호 상태일 때, WaitOne() 메서드를 호출한 스레드는 대기를 멈추고 실행을 계속합니다. 신호 상태가 되면, 자동으로 AutoResetEvent는 비신호 상태로 재설정됩니다. 즉, 하나의 스레드만 신호를 받고 진행될 수 있습니다.
- 비신호 상태(Non-signaled): AutoResetEvent가 비신호 상태일 때, WaitOne() 메서드를 호출한 스레드는 신호 상태가 될 때까지 대기 상태에 머뭅니다.
AutoResetEvent는 일반적으로 작업이 완료되었을 때 다른 스레드에 알리는 데 사용됩니다.
예를 들어, 백그라운드 스레드가 데이터 처리를 완료하면 메인 스레드에게 신호를 보낼 수 있습니다.
C# 예제 코드입니다.
using System;
using System.Threading;
public class Example
{
// AutoResetEvent 인스턴스 생성, 초기 상태는 비신호 상태(false)
private static AutoResetEvent autoEvent = new AutoResetEvent(false);
public static void Main()
{
Console.WriteLine("메인 스레드 작업을 시작합니다.");
// 백그라운드 스레드 시작
Thread workerThread = new Thread(DoWork);
workerThread.Start();
// 작업이 끝날 때까지 대기
Console.WriteLine("백그라운드 스레드의 작업 완료를 기다립니다.");
autoEvent.WaitOne();
Console.WriteLine("백그라운드 스레드의 작업이 완료되었습니다.");
// 다른 작업 수행
Console.WriteLine("메인 스레드 작업을 계속합니다.");
}
public static void DoWork()
{
Console.WriteLine("백그라운드 스레드에서 작업을 시작합니다.");
// 시간이 걸리는 작업을 가정
Thread.Sleep(5000);
Console.WriteLine("백그라운드 스레드에서 작업이 완료되었습니다.");
// 작업이 완료되었으므로 메인 스레드에 신호를 보냄
autoEvent.Set();
}
}
메인 스레드는 autoEvent.WaitOne()를 호출하여 백그라운드 스레드의 작업이 완료될 때까지 대기합니다.
백그라운드 스레드에서 작업이 끝나면 autoEvent.Set()를 호출하여 메인 스레드에게 신호를 보냅니다.
이 신호를 받은 메인 스레드는 대기 상태에서 벗어나 후속 작업을 계속합니다.
LIST
'멀티쓰레드 프로그래밍' 카테고리의 다른 글
ReaderWriterLock (0) | 2024.02.27 |
---|---|
ManualResetEvent (0) | 2024.02.27 |
Context Switching (0) | 2024.02.26 |
SpinLock (0) | 2024.02.23 |
DeadLock (0) | 2024.02.23 |