멀티쓰레드 프로그래밍

AutoResetEvent

우대비 2024. 2. 26. 23:53

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