뮤텍스 (Mutex)란?
뮤텍스(Mutex, Mutual Exclusion)는 하나의 공유 자원에 여러 스레드가 동시에 접근하는 것을 방지하기 위한 동기화 기법이다.
멀티스레드 환경에서 발생할 수 있는 경쟁 조건(Race Condition)을 방지하고, 임계영역(Critical Section)을 안전하게 보호하는 데 사용된다.
주요 특징
- 단일 자원 보호에 특화된 락
- 소유 개념 존재: 락을 획득한 스레드만 해제할 수 있다
- 임계영역 보호: 동시 접근을 차단하여 데이터 일관성 유지
- 커널 기반 동기화 도구: 필요 시 사용자 모드 → 커널 모드 전환 (문맥 교환 발생 가능)
동작 방식
뮤텍스는 기본적으로 다음의 구조로 작동한다.
- 스레드가 공유 자원을 사용하기 전 lock을 시도
- 다른 스레드가 이미 뮤텍스를 소유하고 있다면 블로킹 상태로 대기
- 자원을 사용한 후 unlock을 호출해 다른 스레드에게 뮤텍스를 넘김
이 과정을 통해 자원 접근은 한 번에 하나의 스레드만 허용되며, 경쟁 조건을 방지할 수 있다.
예제 코드 (POSIX pthread 기반)
#include <iostream>
#include <pthread.h>
int counter = 0;
pthread_mutex_t lock;
void* increment(void* arg) {
for (int i = 0; i < 100000; ++i) {
pthread_mutex_lock(&lock); // 임계영역 진입
counter++;
pthread_mutex_unlock(&lock); // 임계영역 탈출
}
return nullptr;
}
int main() {
pthread_t t1, t2;
pthread_mutex_init(&lock, nullptr); // 뮤텍스 초기화
pthread_create(&t1, nullptr, increment, nullptr);
pthread_create(&t2, nullptr, increment, nullptr);
pthread_join(t1, nullptr);
pthread_join(t2, nullptr);
pthread_mutex_destroy(&lock); // 뮤텍스 해제
std::cout << "Final counter: " << counter << std::endl;
return 0;
}
단점 및 주의사항
- 문맥 교환 발생: 뮤텍스는 블로킹 기반으로, 대기 중인 스레드는 CPU를 반납하고 재스케줄링 필요 → 성능 저하
- 데드락 위험: 여러 락을 중첩 사용할 경우 순서에 따라 교착 상태가 발생할 수 있음
- 락 경합: 많은 스레드가 동일한 자원에 접근하려 할 때 성능 저하
- 오버헤드: 빈번한 락/언락은 성능에 영향을 줄 수 있음
'OS' 카테고리의 다른 글
스핀락(Spin Lock) (0) | 2025.06.24 |
---|---|
세마포어(Semaphore) (0) | 2025.06.24 |
멀티쓰레드 환경에서 생길 수 있는 문제들 (0) | 2025.06.24 |
다양한 OS 스케줄링 기법 (0) | 2025.06.24 |
쓰레드와 프로세스 (Thread & Process) (0) | 2025.06.24 |