[c#] C# 스레드 동기 메소드

C#에서 멀티스레딩을 구현할 때, 동기화는 공유 자원에 대한 접근을 조절하는 중요한 요소입니다. lock 키워드를 사용하여 Critial Section을 만드는 것이 일반적이지만, .NET 프레임워크는 여러 스레드 간의 작업을 동기화하기 위한 다양한 메소드를 제공합니다.

Monitor 클래스

Monitor 클래스는 EnterExit 메소드를 사용하여 Critical Section을 정의합니다. 이를 통해 특정 블록의 코드를 한 번에 하나의 스레드만 실행할 수 있도록 보장할 수 있습니다.

class Program
{
    static object lockObject = new object();

    static void Main(string[] args)
    {
        lock (lockObject)
        {
            // Critical Section Logic
        }
    }
}

위의 코드를 Monitor 클래스로 대체하면 다음과 같습니다.

class Program
{
    static object lockObject = new object();

    static void Main(string[] args)
    {
        Monitor.Enter(lockObject);
        try
        {
            // Critical Section Logic
        }
        finally
        {
            Monitor.Exit(lockObject);
        }
    }
}

이렇게 사용하면 lock키워드보다 좀 더 세밀한 제어를 할 수 있습니다.

Semaphore 클래스

Semaphore 클래스는 동시에 여러 스레드가 접근할 수 있는 리소스의 개수를 제어하는데 사용됩니다. 이 클래스를 사용하면 Critical Section을 접근할 때 특정 갯수의 스레드만 허용할 수 있습니다.

class Program
{
    static Semaphore semaphore = new Semaphore(1, 1);

    static void Main(string[] args)
    {
        semaphore.WaitOne();
        try
        {
            // Critical Section Logic
        }
        finally
        {
            semaphore.Release();
        }
    }
}

참고 자료