반응형
C# Mutex: 컴퓨터학부생을 위한 설명
Mutex는 "Mutual Exclusion"의 약자로, 여러 스레드 또는 프로세스가 동시에 같은 리소스에 접근하지 못하도록 막아주는 동기화 도구입니다. 주로 다중 프로세스 환경에서 공유 리소스를 보호하거나, 특정 리소스에 하나의 인스턴스만 접근하도록 보장할 때 사용합니다.
코드 분석
다음은 제시된 코드를 분석한 결과입니다:
코드 내용
const string MutexName = "CharpThreadingMutex";
using (var m = new Mutex(false, MutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(5), false))
{
Console.WriteLine("Second instance is running!");
}
else
{
Console.WriteLine("Running!");
Console.ReadLine();
m.ReleaseMutex();
}
}
코드 설명
- Mutex 생성:
- MutexName을 "CharpThreadingMutex"로 지정합니다.
- false: Mutex를 생성한 스레드가 즉시 잠금을 획득하지 않습니다.
- 네임드 Mutex "CharpThreadingMutex"는 시스템 전역에서 유효하며, 동일한 이름으로 다른 프로세스에서 접근 가능합니다.
- const string MutexName = "CharpThreadingMutex"; using (var m = new Mutex(false, MutexName))
- WaitOne 메서드:
- WaitOne은 현재 스레드가 Mutex를 소유하려고 시도합니다.
- 매개변수:
- TimeSpan.FromSeconds(5): 최대 5초 동안 대기합니다.
- false: 대기 중 인터럽트를 허용하지 않습니다.
- 반환값:
- true: Mutex 잠금을 성공적으로 획득한 경우.
- false: 5초 동안 대기했지만, 다른 스레드 또는 프로세스가 Mutex를 점유하고 있는 경우.
- 결과:
- Mutex를 점유할 수 없으면 "Second instance is running!"을 출력합니다.
- if (!m.WaitOne(TimeSpan.FromSeconds(5), false))
- 임계 구역 실행:
- Mutex를 성공적으로 점유한 경우:
- "Running!"을 출력합니다.
- Console.ReadLine()으로 사용자 입력을 대기합니다.
- 작업이 끝난 후 ReleaseMutex를 호출하여 Mutex 잠금을 해제합니다.
- Mutex를 성공적으로 점유한 경우:
- else { Console.WriteLine("Running!"); Console.ReadLine(); m.ReleaseMutex(); }
- using 문:
- using은 Mutex 객체가 범위를 벗어나면 자동으로 Dispose를 호출합니다.
- 리소스 누수를 방지합니다.
동작 흐름
- 첫 번째 프로세스가 실행될 때:
- Mutex가 생성되고, 첫 번째 프로세스가 Mutex를 점유합니다.
- 콘솔에 "Running!"이 출력됩니다.
- 두 번째 프로세스가 실행될 때:
- 동일한 이름의 Mutex가 이미 다른 프로세스에 의해 점유 중입니다.
- 두 번째 프로세스는 최대 5초 동안 Mutex 잠금을 기다리지만 실패합니다.
- 콘솔에 "Second instance is running!"이 출력됩니다.
Mutex의 주요 특징
- 네임드 Mutex:
- 시스템 전역에서 유효하며, 여러 프로세스가 공유할 수 있습니다.
- 같은 이름으로 생성된 Mutex는 동일한 객체를 참조합니다.
- 잠금 획득:
- WaitOne을 호출하여 잠금을 시도하며, 대기 시간 제한을 설정할 수 있습니다.
- 잠금 해제:
- Mutex를 점유한 스레드는 반드시 ReleaseMutex를 호출하여 잠금을 해제해야 합니다.
- 그렇지 않으면 다른 스레드나 프로세스가 Mutex를 점유할 수 없습니다.
Mutex 사용 사례
- 프로세스 간 단일 인스턴스 보장:
- 위 코드는 특정 애플리케이션의 여러 인스턴스가 동시에 실행되지 않도록 제한합니다.
- 실행 중인 인스턴스가 있는 경우 두 번째 인스턴스는 바로 종료하거나 사용자에게 알립니다.
- 공유 리소스 보호:
- 파일, 데이터베이스 또는 네트워크 리소스에 여러 스레드가 동시에 접근하는 것을 막습니다.
주의 사항
- 교착 상태:
- Mutex를 점유한 스레드가 ReleaseMutex를 호출하지 않으면 다른 스레드가 영원히 대기 상태에 빠질 수 있습니다.
- 성능:
- Mutex는 운영 체제 커널 수준의 동기화 도구로, 스레드 동기화만 필요한 경우에는 lock이나 Monitor가 더 효율적입니다.
결론
이 코드는 멀티프로세스 환경에서 특정 프로그램이 동시에 실행되지 않도록 보장하는 데 사용됩니다. Mutex는 프로세스 간 동기화가 필요할 때 적합한 도구이며, 코드에서 Mutex 이름을 공유하여 이 목적을 달성하고 있습니다.
추가로 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든지 물어보세요! 😊
반응형
'C# > 쓰레드' 카테고리의 다른 글
C# `Thread`와 `ThreadPool`의 차이점 및 델리게이트 비동기 호출 이해 (16) | 2025.01.16 |
---|---|
C# 스레드풀(Thread Pool): 개념, 사용법, 및 예제 코드 설명 (1) | 2025.01.16 |
C# SemaphoreSlim: 멀티스레드 리소스 접근 제어 예제와 설명 (1) | 2025.01.16 |
C# 스레드 제어: Semaphore와 SemaphoreSlim의 차이와 사용법 (2) | 2025.01.16 |
원자적 작업(Atomic Operation): 동시성 문제 해결의 핵심 개념 (2) | 2025.01.16 |
스레드 우선순위와 CPU 시간 할당 이해하기 (2) | 2025.01.14 |
스레드_스레드 상태 조사_thread state (4) | 2025.01.06 |
c# 스레드 기초 (1) | 2025.01.06 |