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