Linux

뮤텍스(Mutex)와 세마포어(Semaphore)

스카이데이즈 2026. 2. 24. 13:55
728x90

뮤텍스(Mutex)와 세마포어(Semaphore)는 동기화(Synchronization)를 위한 도구이지만, 목적과 동작 방식에서 중요한 차이 있음


1️⃣ 기본 개념

🔐 뮤텍스 (Mutex: Mutual Exclusion)

  • 상호 배제를 위한 락(Lock)
  • 한 번에 오직 하나의 스레드만 공유 자원에 접근 가능
  • 락을 건 스레드만이 락을 해제할 수 있음
  • 소유권(ownership) 개념이 있음

👉 "화장실 열쇠 하나"


🚦 세마포어 (Semaphore)

  • 카운팅 기반 동기화 도구
  • 동시에 접근 가능한 스레드 수를 정수 값으로 제어
  • 소유권 개념이 없음 (다른 스레드가 해제 가능)
  • 두 종류가 있음:
    • Binary Semaphore (0 또는 1)
    • Counting Semaphore (0 이상 정수)

👉 "입장 가능한 인원이 N명인 세미나실"


2️⃣ 핵심 차이점 비교

구분뮤텍스세마포어

목적 상호 배제 자원 개수 제어
접근 가능 수 1개 1개 이상 가능
값 범위 0 / 1 0 이상 정수
소유권 있음 (락 건 스레드만 해제 가능) 없음
주 사용처 임계 구역 보호 자원 풀 관리, 생산자-소비자 문제

3️⃣ 동작 방식 차이

🔐 뮤텍스

lock()  → 임계영역 진입
unlock() → 임계영역 해제
  • 이미 lock 되어 있으면 대기
  • unlock은 반드시 lock한 스레드가 해야 함

🚦 세마포어

wait(P)  → 카운트 감소
signal(V) → 카운트 증가
  • 카운트가 0이면 대기
  • 다른 스레드가 signal 가능

4️⃣ Binary Semaphore vs Mutex 차이

Binary Semaphore는 겉보기엔 Mutex와 비슷하지만:

항목MutexBinary Semaphore

소유권 있음 없음
잘못 해제 시 에러 발생 가능 다른 스레드가 해제 가능
우선순위 역전 대응 OS 차원 지원 가능 일반적으로 없음

👉 그래서 "Binary Semaphore = Mutex"는 정확히 같은 개념은 아님.


5️⃣ 언제 무엇을 쓰는가?

🔹 뮤텍스를 쓰는 경우

  • 공유 변수 보호
  • 임계영역 보호
  • 자료구조 동기화
  • null pointer race 방지

🔹 세마포어를 쓰는 경우

  • DB 커넥션 풀 (최대 N개 허용)
  • 스레드 풀 제한
  • 생산자-소비자 문제
  • 리소스 개수 제한

 

 

🔹 C 언어에서 뮤택스

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex;   // 1. 뮤텍스 선언
int counter = 0;         // 공유 자원

void* thread_func(void* arg) {
    for (int i = 0; i < 1000000; i++) {

        pthread_mutex_lock(&mutex);     // 3. lock
        counter++;                      // 임계 영역
        pthread_mutex_unlock(&mutex);   // 5. unlock
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;

    pthread_mutex_init(&mutex, NULL);   // 2. 초기화

    pthread_create(&t1, NULL, thread_func, NULL);
    pthread_create(&t2, NULL, thread_func, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);      // 6. 제거

    printf("Final counter: %d\n", counter);
    return 0;
}
728x90