Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 스레드 동기화 완벽 정리: lock과 Mutex 활용법

멀티스레드 애플리케이션에서는 여러 스레드가 동시에 같은 자원에 접근할 수 있기 때문에 동기화(Synchronization) 처리가 필수적입니다. 이 글에서는 C#에서 제공하는 lock 문과 Mutex 클래스를 활용해 공유 자원에 대한 접근을 안전하게 제어하는 방법을 살펴봅니다.

스레드 동기화를 위한 Mutex

Mutex(뮤텍스)는 프로세스 간에도 스레드를 동기화할 수 있는 강력한 도구입니다. 특정 코드 블록을 한 번에 하나의 스레드만 실행하도록 제어해야 할 때 유용하게 사용됩니다.

C#에서는 lock 문을 사용하여 다른 스레드의 방해 없이 코드 블록이 중단 없이 실행되도록 보장할 수 있습니다. 즉, 해당 코드 블록이 실행되는 동안 지정된 객체에 대해 상호 배제(Mutual-exclusion) 잠금이 걸리며, 다른 스레드는 이 블록에 진입할 수 없습니다.

lock 문의 기본 사용법

lock 문은 객체를 인수로 받습니다. 이때 전달되는 매개변수는 반드시 참조 타입(reference type) 기반의 객체여야 합니다. 일반적으로 private 필드로 잠금 객체를 선언하여 외부에서 접근하지 못하도록 하는 것이 권장됩니다.

public class Demo {
    private System.Object myLock = new System.Object();
    public void Process() {
        lock (myLock) {
            // 한 번에 하나의 스레드만 실행할 수 있는 코드 영역
        }
    }
}

Mutex 클래스란?

C#의 Mutex 클래스는 동기화 기본 요소(synchronization primitive) 중 하나로, 단일 프로세스 내부의 스레드 동기화뿐 아니라 프로세스 간 동기화(interprocess synchronization)에도 활용할 수 있다는 점이 lock 문과 큰 차이입니다.

새로운 Mutex 인스턴스를 생성하는 방법은 다음과 같습니다.

private static Mutex m = new Mutex();

이렇게 생성한 Mutex는 WaitOne()으로 잠금을 획득하고, 작업이 끝난 후 ReleaseMutex()로 해제하는 방식으로 사용합니다. 프로세스 경계를 넘어 공유 자원을 보호해야 하는 상황이라면 Mutex가 적합한 선택입니다.