C# 뮤텍스(Mutex) 클래스란?
C#의 Mutex(뮤텍스) 클래스는 스레드 동기화를 위한 기본 요소(synchronization primitive)로, 하나의 프로세스 내부에서의 스레드 동기화뿐만 아니라 프로세스 간 동기화(interprocess synchronization)에도 활용할 수 있다는 점이 큰 특징입니다.
뮤텍스는 한 번에 하나의 스레드 또는 프로세스만 공유 자원에 접근할 수 있도록 제어하며, '소유권' 개념을 가지고 있어 락을 획득한 스레드만이 이를 해제할 수 있습니다.
새로운 뮤텍스 생성하기
가장 기본적인 방식으로 새로운 Mutex 인스턴스를 생성하는 코드는 다음과 같습니다.
private static Mutex m = new Mutex();
Boolean 값을 사용한 초기화
생성자에 Boolean 값을 전달하면 초기 소유권 여부를 지정할 수 있습니다. true를 전달하면 호출한 스레드가 뮤텍스의 초기 소유자가 됩니다.
private static Mutex m = new Mutex(true);
이름을 지정한 명명된(Named) 뮤텍스 생성
Boolean 값과 함께 뮤텍스 이름을 문자열로 전달하면 명명된(named) 뮤텍스를 만들 수 있습니다. 명명된 뮤텍스는 운영체제 차원에서 관리되므로 서로 다른 프로세스 간의 동기화에 사용할 수 있습니다.
예제 코드
using System;
using System.Threading;
public class Demo {
public static void Main() {
Mutex mt = new Mutex(false, "NewMutex");
Console.WriteLine("Waiting for the Mutex.");
mt.WaitOne();
Console.WriteLine("Owner of the mutex. ENTER is to be pressed to release the mutex and exit.");
Console.ReadLine();
mt.ReleaseMutex();
}
}
실행 결과
Waiting for the Mutex.
Owner of the mutex. ENTER is to be pressed to release the mutex and exit.
코드 동작 흐름 설명
new Mutex(false, "NewMutex"): 초기 소유권 없이 "NewMutex"라는 이름의 명명된 뮤텍스를 생성합니다.WaitOne(): 뮤텍스의 소유권을 요청합니다. 이미 다른 스레드나 프로세스가 소유 중이라면 대기 상태가 됩니다.ReleaseMutex(): 뮤텍스 소유권을 해제하여 다른 스레드나 프로세스가 자원에 접근할 수 있도록 합니다.
프로그램을 실행하면 먼저 뮤텍스 소유권을 기다린 뒤, 획득에 성공하면 콘솔에 메시지가 출력됩니다. 이후 Enter 키를 누르면 뮤텍스가 해제되면서 프로그램이 종료됩니다.