뮤텍스(Mutex, Mutual Exclusion)는 여러 스레드가 공유 자원에 동시 접근하는 것을 막기 위한 상호 배제 잠금(lock) 이다. 한 번에 하나의 스레드만 잠금을 획득할 수 있으며, 임계 구역(Critical Section)을 보호한다.
| 항목 | 뮤텍스 | 세마포어 |
|---|
| 소유권 | 잠근 스레드만 해제 가능 | 누구나 signal 가능 |
| 값 | 0 또는 1 (이진) | 0 이상 정수 |
| 주 용도 | 임계 구역 보호 | 자원 개수 제어 |
| 데드락 위험 | 있음 | 있음 |
| 우선순위 역전 | 해결책 있음 (Priority Inheritance) | 복잡 |
구현 예시
python
import threading
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
with lock: # acquire + release 자동
counter += 1 # 임계 구역
threads = [threading.Thread(target=increment) for _ in range(5)]
for t in threads: t.start()
for t in threads: t.join()
print(counter) # 항상 500000 (잠금 없으면 race condition)
C++ 스마트 잠금
cpp
# include <mutex>
std::mutex mtx;
void safe_increment() {
std::lock_guard<std::mutex> lock(mtx); // RAII: 범위 벗어나면 자동 해제
counter++;
}
// 조건부 잠금
std::unique_lock<std::mutex> lk(mtx);
cv.wait(lk, []{ return data_ready; }); // 조건 변수와 함께 사용
재진입 가능 뮤텍스 (Recursive Mutex)
같은 스레드가 이미 보유한 잠금을 다시 획득할 수 있다. 재귀 함수 내 잠금 필요 시 사용.
데드락 예방
두 스레드가 두 뮤텍스를 역순으로 잠그면 데드락:
Thread A: lock(m1) → lock(m2)
Thread B: lock(m2) → lock(m1) ← 교착!
해결: 항상 같은 순서로 잠금 (Lock Ordering)
관련 개념
- •세마포어 — 더 일반적인 동기화 원시 연산
- •데드락 — 뮤텍스 오용 시 발생
- •프로세스와 스레드 — 뮤텍스가 보호하는 단위
- •동시성 — 뮤텍스가 필요한 환경