포스트

WPF 에서의 동기화 도구 비교

WPF 에서의 동기화 도구 비교

WPF에서의 동기화 도구 비교: lock, SemaphoreSlim, Mutex, Semaphore

WPF 애플리케이션 개발에서는 멀티스레드 환경에서 공유 자원에 대한 동기화가 필수적입니다. 이를 적절히 처리하지 않으면 데이터 불일치, 교착 상태(Deadlock), UI 프리징 같은 문제가 발생할 수 있습니다.

이번 글에서는 자주 쓰이는 네 가지 동기화 도구를 정리합니다.

  • lock (Monitor)
  • SemaphoreSlim
  • Mutex
  • Semaphore

1. lock (Monitor)

  • C# 언어 차원에서 제공하는 키워드.
  • 내부적으로 Monitor를 사용해 한 번에 하나의 스레드만 임계 구역 진입.
  • 프로세스 내부 전용.

사용법

1
2
3
4
5
6
7
8
9
10
private readonly object _lockObj = new();
private int _counter;

void Increment()
{
    lock (_lockObj)
    {
        _counter++;
    }
}

장단점 및 결과

  • 빠르고 가벼움 (커널 전환 없음).
  • ✅ 코드가 단순.
  • await 불가 → 비동기 작업 보호에는 부적합.
  • ❌ 프로세스 간 동기화 불가.

👉 짧고 빠른 동기화 구역에서 최적.


2. SemaphoreSlim

  • 경량화된 세마포어.
  • 동시 실행 개수를 제한 가능.
  • WaitAsync 제공 → 비동기 코드에서 자연스럽게 사용 가능.

사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private readonly SemaphoreSlim _sem = new(1, 1); // 동시 1개만 허용

async Task SaveAsync()
{
    await _sem.WaitAsync();
    try
    {
        await Task.Delay(1000); // DB 저장 시뮬레이션
    }
    finally
    {
        _sem.Release();
    }
}

장단점 및 결과

  • 비동기 친화적 (await 가능).
  • ✅ 동시 실행 개수를 자유롭게 조정 가능.
  • Release 누락 시 교착 상태 발생 가능.
  • ❌ 프로세스 간 동기화 불가.

👉 WPF + 비동기 코드에서는 가장 많이 쓰이는 기본 도구.


3. Mutex

  • Mutual Exclusion (상호 배제).
  • 한 번에 하나만 접근 가능.
  • Named Mutex를 사용하면 프로세스 간 단독 실행 보장 가능.

사용법

1
2
3
4
5
6
7
8
9
10
bool createdNew;
using var mutex = new Mutex(true, "Global\\MyWpfApp", out createdNew);

if (!createdNew)
{
    Console.WriteLine("이미 실행 중입니다.");
    return;
}

// 단일 실행 보장

장단점 및 결과

  • 프로세스 간 동기화 가능.
  • ✅ 앱 단일 실행 보장에 유용.
  • ❌ 커널 오브젝트 기반 → 상대적으로 무거움.
  • await 불가.

👉 앱 단일 인스턴스 보장이나 파일 단독 접근 같은 특수한 상황에만 사용.


4. Semaphore

  • OS 수준 세마포어.
  • 지정된 수만큼 스레드/프로세스 접근 허용.
  • 프로세스 간 동기화 가능.

사용법

1
2
3
4
5
6
7
8
9
10
11
var semaphore = new Semaphore(3, 3); // 동시 3개 허용

semaphore.WaitOne();
try
{
    // 작업 처리
}
finally
{
    semaphore.Release();
}

장단점 및 결과

  • ✅ 프로세스 간 동시 접근 제어 가능.
  • ❌ 커널 오브젝트 기반이라 무거움.
  • await 불가.
  • ❌ 현대 WPF 앱에서는 잘 사용되지 않음.

👉 레거시 시스템이나 특수한 멀티프로세스 제어에서만 고려.


최종 정리

도구특징적합한 경우
lock프로세스 내부,가볍고 빠름짧은 임계 구역 보호
SemaphoreSlim비동기 지원, 동시성 N개 제한WPF 비동기 로직 보호
Mutex단독 점유, 프로세스 간 가능앱 단일 실행, 파일 단독 접근
Semaphore프로세스 간, 동시성 N개 제한레거시/특수 멀티프로세스 상황

결론

  • 동기 코드 보호lock
  • 비동기 코드 보호SemaphoreSlim
  • 앱 단일 인스턴스 보장Mutex
  • 특수한 멀티프로세스 동기화Semaphore

특히 WPF에서는 UI 스레드 프리징을 막기 위해 SemaphoreSlim.WaitAsync를 사용하는 습관이 중요합니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.