본문 바로가기
운영체제 & 컴퓨터 기초

🧩 Thread 동기화 3종 세트: 크리티컬 섹션, 뮤텍스, 세마포어

by logro 2025. 3. 28.
728x90

안녕하세요 logro 입니다 :)

오늘은 멀티쓰레딩 환경에서 공유 자원을 안전하게 다루는 3가지 도구,

바로
크리티컬 섹션(Critical Section),
뮤텍스(Mutex),
세마포어(Semaphore)에 대해 알아볼게요!


😵 공유 자원, 왜 위험할까요?

여러 쓰레드가 동시에 같은 변수를 바꾸려고 한다면…?

  • 데이터가 꼬인다
  • 잘못된 결과가 나온다
  • 버그가 잡기 힘들어진다 😱

이걸 막기 위해 한 번에 하나의 쓰레드만 자원을 사용하도록 하는 게
바로 동기화의 목적이에요!


🔒 1. 크리티컬 섹션 (Critical Section)

크리티컬 섹션은 공유 자원을 접근하는 코드 영역을 의미해요.

lock (someObject)
{
    // 이 안이 바로 크리티컬 섹션!
    sharedValue++;
}
  • 이 블록은 하나의 쓰레드만 진입 가능
  • lock 키워드나 Monitor.Enter/Exit을 사용해서 구현 가능
  • 동기화 자체를 의미하는 개념이에요

📌 요약:

"공유 자원에 접근하는 '위험 구간'을 안전하게 보호하자!"


🧱 2. 뮤텍스 (Mutex)

Mutex는 크리티컬 섹션을 보호하는 도구 중 하나예요.
특징은 👉 프로세스 간 동기화도 가능하다는 것!

Mutex mutex = new Mutex();

mutex.WaitOne(); // 잠금
try
{
    // 크리티컬 섹션
}
finally
{
    mutex.ReleaseMutex(); // 해제
}
  • 여러 쓰레드 뿐만 아니라 여러 앱/프로세스 간에도 자원 보호 가능
  • 하지만 lock보다 무겁고 느림

📌 요약:

"서로 다른 프로그램끼리도 자원 충돌 막고 싶을 때 사용!"


🚦 3. 세마포어 (Semaphore)

세마포어는 동시에 접근 가능한 쓰레드 수를 제한해주는 도구예요.

Semaphore semaphore = new Semaphore(2, 2); // 동시에 2개까지 허용

semaphore.WaitOne(); // 입장 시도
try
{
    // 제한된 리소스를 사용하는 코드
}
finally
{
    semaphore.Release(); // 퇴장
}
  • 뮤텍스는 1개만 허용, 세마포어는 N개까지 허용
  • 예: 동시에 2명만 이용 가능한 프린터, API 제한 등

📌 요약:

"제한된 리소스를 여러 쓰레드가 순서대로 사용하게 하자!"


💡 비교 요약 표

구분 허용 개수 사용 범위 특징
크리티컬 섹션 1 쓰레드 간 (논리적) lock, Monitor 등으로 구현
뮤텍스 1 쓰레드 + 프로세스 무겁지만 강력함
세마포어 N 쓰레드 + 프로세스 제한된 리소스 동시 사용 제어

✅ 정리하며

  • 크리티컬 섹션은 "이 구역은 한 쓰레드만!"
  • 뮤텍스는 "나중에 들어오세요, 지금은 한 명만 가능해요"
  • 세마포어는 "최대 N명까지만 입장 가능합니다~"

멀티쓰레딩을 제대로 다루려면
이 세 가지 개념은 꼭 알고 넘어가야 해요 😉

그럼 오늘도 안정적인 코드의 첫걸음을 디뎠으니,
다음에 새로운 개념으로 만나요! 안녕히 계세요 👋

728x90