서버 개발/멀티쓰레드 프로그래밍

대표적인 락/동기화 도구 : Event, Semaphore, Condition Variable, Interlocked 함수, Spin Lock, Slim Tools

지노윈 2025. 9. 18. 11:09
반응형

Event (이벤트 객체)

  • 설명: 특정 조건이 충족될 때까지 스레드들을 대기시키거나, 시그널을 보내서 깨어나게 하는 도구.
  • 특징:
    • CreateEvent, SetEvent, ResetEvent, WaitForSingleObject 등 사용
    • Manual-reset / Auto-reset 방식 제공
  • 활용 예시:
    • "리소스 로딩 끝날 때까지 기다려!" 같은 상황
    • Producer-Consumer 패턴에서 유용

Semaphore (세마포어)

  • 설명: 동시에 접근 가능한 스레드 개수를 제한하는 도구.
  • 특징:
    • 카운터 기반 → 0이면 대기, 양수면 접근 허용
    • CreateSemaphore, ReleaseSemaphore 등 사용
  • 활용 예시:
    • 동시에 5개의 스레드만 DB 연결 풀을 사용할 수 있도록 제한

Condition Variable (조건 변수)

  • 설명: SRWLock이나 Critical Section과 함께 사용, 특정 조건이 만족될 때까지 스레드 대기.
  • 특징:
    • SleepConditionVariableCS, SleepConditionVariableSRW 등 제공
    • WakeConditionVariable, WakeAllConditionVariable로 깨움
  • 활용 예시:
    • "큐가 비어 있으면 기다렸다가, 새 데이터 들어오면 깨어나 처리"

Interlocked 함수 (원자적 연산)

  • 설명: 별도 락 없이도 CPU 차원에서 보장되는 원자적 연산.
  • 예시 함수:
    • InterlockedIncrement, InterlockedDecrement, InterlockedCompareExchange
  • 특징:
    • 가장 가볍고 빠름
    • 단순 카운터, 플래그, 참조 횟수 관리에 적합

Spin Lock

  • 설명: 대기 중에 스레드가 Sleep 없이 계속 CPU를 돌면서 락이 풀릴 때까지 기다림.
  • 특징:
    • 컨텍스트 스위치가 발생하지 않아, 짧은 시간 잠금 상황에서 유리
    • 하지만 장시간 대기 시 CPU 낭비 심함
  • Windows에서는 KeAcquireSpinLock 같은 커널 API도 있지만, 유저 모드에서는 std::atomic_flag 같은 걸로 구현 가능

Slim Tools (C++11 이후 표준 라이브러리)

  • std::mutex
  • std::recursive_mutex
  • std::shared_mutex (C++17) → SRWLock과 비슷한 Reader/Writer 락
  • std::condition_variable
  • 특징:
    • 플랫폼 독립적이라 크로스플랫폼 엔진 개발 시 사실상 표준
    • 내부적으로 Windows에서는 SRWLock이나 Critical Section을 이용

 

반응형