Mutex 란?

 

동기화 객체로, 멀티스레드 환경에서 여러 스레드가 동일한 리소스에 동시에 접근하지 못하도록 막아주는 도구입니다. 이를 통해 여러 스레드가 동일한 자원을 동시에 사용하는 경우 발생할 수 있는 데이터 충돌이나 비정상 동작을 방지할 수 있습니다.

주요 특징

  1. 상호 배제(Mutual Exclusion): 한 번에 하나의 스레드만 리소스에 접근할 수 있도록 보장합니다.
  2. 스레드 안전(Thread Safety): 뮤텍스를 사용하면 다중 스레드 환경에서 데이터 일관성과 무결성을 유지할 수 있습니다.
  3. 프로세스 간 동기화: 뮤텍스는 단순히 하나의 프로세스 내에서만 사용되는 것이 아니라, 여러 프로세스 간에도 사용될 수 있습니다. 이는 프로세스 간 자원 접근을 동기화하는 데도 유용합니다.

뮤텍스의 동작 원리

뮤텍스는 **잠금(Lock)과 해제(Unlock)**의 개념을 기반으로 동작합니다. 한 스레드가 뮤텍스를 획득하면(잠금), 다른 스레드는 해당 리소스에 접근하지 못하고 대기하게 됩니다. 뮤텍스를 획득한 스레드가 작업을 끝낸 후 뮤텍스를 해제하면, 대기 중이던 다른 스레드가 뮤텍스를 획득하고 리소스에 접근할 수 있게 됩니다.

뮤텍스와 세마포어 차이

  • 뮤텍스(Mutex): 한 번에 오직 하나의 스레드만 자원에 접근할 수 있습니다.
  • 세마포어(Semaphore): 카운터를 기반으로 동작하여, 여러 스레드가 동시에 자원에 접근할 수 있습니다(최대 N개의 스레드).

요약

  • **뮤텍스(Mutex)**는 상호 배제를 보장하는 동기화 도구로, 멀티스레드 환경에서 한 스레드가 자원을 사용하고 있을 때 다른 스레드가 접근하지 못하도록 제어합니다.
  • 이를 통해 동시성 문제를 해결하고, 데이터의 일관성과 무결성을 유지할 수 있습니다.

 

App.xaml 에서의 Mutex 사용 예시

 

이 코드는 주로 다중 인스턴스 방지를 위해 사용됩니다.

  • Mutex를 이용해 특정 리소스나 실행 상태를 하나의 인스턴스만 점유할 수 있도록 제한합니다.
  • 이름이 _mutexName인 Mutex가 이미 존재한다면, 이는 다른 인스턴스가 이미 실행 중이라는 뜻이므로 현재 인스턴스를 종료하게 됩니다.

new Mutex(true, _mutexName, out bool createNew):

 

  • Mutex 객체를 생성하고, 첫 번째 매개변수로 true를 전달함으로써 즉시 Mutex를 소유하려고 시도합니다.
  • _mutexName은 이 Mutex의 고유 이름을 지정하는 문자열입니다. 이 이름을 통해 시스템 전체에서 동일한 Mutex를 참조할 수 있습니다.
  • createNew는 Mutex가 처음 생성되었는지 여부를 반환합니다.
    • true이면 이 Mutex가 현재 애플리케이션에서 처음 생성된 것이고,
    • false이면 이미 같은 이름의 Mutex가 존재하는 것입니다(즉, 이미 다른 인스턴스가 실행 중).

if (!createNew):

  • 만약 createNew가 false라면, 이미 동일한 이름의 Mutex가 존재하는 것이므로 다른 인스턴스가 실행 중이라는 의미입니다.
  • 이때, 애플리케이션을 종료하는 Shutdown()을 호출합니다.

 

'■알아두면 좋은내용 > C#' 카테고리의 다른 글

Flatbuffers (플랫버퍼)  (0) 2024.09.24
UI 자동화 지원  (0) 2024.09.19
프로그램 이 이유도 없이 죽을 때 해결 방법  (0) 2024.09.19

+ Recent posts