안녕하세요! devBong입니다!
오늘은 C# Mutex에 관해서 알아보도록 할게요!
1. Mutex란?
C#에서 Mutex는 C++과 동일하게 멀티 쓰레드 환경에서 동기화의 목적으로 사용합니다. 한 쓰레드 혹은 프로세스가 어떤 공유 리소스를 사용하고 있을 때, 다른 여러 쓰레드 혹은 프로세스들이 접근하지 못하도록 막기 위한 것이죠. 만약 프로세스들이 접근해 버리면 메모리를 여러 곳에서 동시에 사용되서 만약 값이 변경되거나 없어져 버리면 원치 않는 결과를 리턴할 수 도 있기 때문에 한 프로세스씩 접근하도록 막는 것 입니다. 한 프로세스가 끝나면 값이 초기화 되기 때문에 다음 프로세스가 들어와도 값의 변경에 대한 위험이 없겠죠?
또한 C++과 마찬가지로 Mutex를 프로그램의 중복 상태를 검사할 수 있습니다. 같은 프로그램이 두번 실행되면 두개 프로그램이 띄워지기 때문에 한 운영체제당 하나의 프로그램만 띄우게 만드는 것이죠. (프로그램의 특성상, 중복을 허가하는 프로그램도 있습니다. ex. Visual Studio, Unity, Chrome 등)
그래서 오늘은 간단하게 프로그램의 중복을 검사하여 현재 프로그램의 상태를 검사하는 코드를 작성해 볼께요.
2. 코드 작성
프로그램이 완전히 로드가 되기 전에 실행이 되는 것이 맞는 거 겠죠? 그래서 저는 WPF에서 중복 방지를 할 때 App.xaml 코드 비하인드에서 실행 되도록 작성하고 있습니다. App.xaml은 아시다시피, MainWindow가 켜지기 전, 프로그램이 최초 시작되는 파일이니까요.
App.xaml에서 먼저 StartUp 설정을 해줍니다. 그러면 앱이 시작되면 StartUp으로 설정된 코드 비하인드 함수를 타게 될 것입니다.
<Application
...
Startup="Application_Startup">
</Application>
그 다음 코드 비하인드 파일인 App.xaml.cs에서 아래 중복 방지 코드를 작성합니다.
public partial class App : IDisposable
{
private Mutex? _mutex; // Mutex 전역변수 설정
...
...
...
private void Application_Startup(object sender, StartupEventArgs e)
{
using (var CurrentProcess = Process.GetCurrentProcess())
{
//현재 윈도우 사용자의 고유 SID를 가져옴
var CurrentUser = System.Security.Principal.WindowsIdentity.GetCurrent().User;
//현재 프로세스가 null이 아닐 경우, 이 프로세스 메인 모듈 (메인 exe)의 경로를 가져 오거나, 기본 어플리케이션 도메인의 경로를 가지고 오거나, 없다면 이 프로그램의 이름을 넣어준다
var ModuleName = CurrentProcess.MainModule?.FileName ?? Assembly.GetEntryAssembly()?.Location ?? "ViewModelPractice";
//가져온 경로를 Byte로 직렬화 후 스트링으로 만들어줌
var byteModule = Convert.ToBase64String(Encoding.UTF8.GetBytes(ModuleName));
//현재 프로세스의 고유 이름을 만들어 줌
var mutexName = (CurrentUser?.Value ?? Environment.UserName) + "_" + byteModule;
//현재 프로세스가 중복인지 검사
_mutex = new Mutex(true, mutexName, out _accepted);
//만약 false이면 중복
if (!_accepted)
{
//중복 시, 실행됨
}
}
}
}
윈도우 사용자의 SID를 가져오는 이유는 계정 하나당 하나의 프로세스를 발급하기 위함입니다. 같은 윈도우라도 다른 계정에서 실행 될 수도 있자나요? 다른 계정에서 실행이된다면 다른 프로세스로 보는 것이죠.
이런 식으로 해서 조금 더 응용해서 프로그램을 만들어 적용해보도록 하겠습니다.
프로그램 하나를 띄워 실행이 되고 있다고 가정해봅시다.

그리고 똑같은 프로그램을 이미 실행시킨 상태로 실행을 하게 되면

이렇게 잘 띄워지는 것을 볼 수 있습니다.
이번 포스트는 Mutex를 활용한 중복 방지에 대해 알아 보았습니다!
다음 포스트에 뵙겠습니다~ 감사합니다.

'if ( Programming ) > WPF' 카테고리의 다른 글
[WPF] 캡처 방지 기능을 만들어 보자 - SetWindowDisplayAffinity (2) | 2023.07.18 |
---|---|
[WPF] MVVM 패턴으로 WPF 시작하기 - 05 Converter (0) | 2023.01.26 |
[WPF] MVVM 패턴으로 WPF 시작하기 - 04 Textbox와 ComboBox (2) | 2023.01.25 |
[WPF] MVVM 패턴으로 WPF 시작하기 - 03 ViewModel 구성 (0) | 2023.01.25 |
[WPF] MVVM 패턴으로 WPF 시작하기 - 02 UI 구성 (Grid, ListView, StackPanel) (0) | 2023.01.24 |