멀티쓰레드 프로그래밍

ManualResetEvent

우대비 2024. 2. 27. 00:52

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