뮤텍스란 여러 스레드나 프로세스가 공유 자원에 동시에 접근하는 것을 막고 하나의 스레드만 접근하도록 제한하는 상호 배제 동기화 기법입니다.
- 뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술
- 뮤텍스는 Locking 메커니즘으로 구현
- 오직 하나의 쓰레드만이 임계 구역에 진입 가능
- 하며 뮤텍스를 획득한 스레드만 뮤텍스를 해제 가능
- 이진적 특성을 지닌다 (잠금 또는 잠금 해제 중 하나이다)
- 블로킹: 스레드가 잠긴 뮤텍스를 획득하려고 시도하면, 뮤텍스가 해제될 때까지 해당 스레드는 차단
wait (mutex);
...
Critical Section
...
signal (mutex);
- Boolean 타입의 Lock 변수를 지닌다.
- Acquire/Release 메서드를 통해 뮤텍스를 얻고 해제한다.
- Non-Busy-Waiting 방식이다.
Busy-Waiting
Link to original
- 원하는 자원을 얻기 위해 기다리는 것이 아니라 권한을 얻을 때까지 반복적으로 확인하는 것을 의미한다.
- CPU의 자원을 쓸데 없이 낭비하기 때문에 좋지 않은 쓰레드 동기화 방식이다.
Mutex의 문제점
예외 발생시 unlock에 대한 수행이 꼭 이뤄져야 한다.
lock.lock();
try {
doSomething();
} finally {
lock.unlock();
}여러 뮤텍스를 동시에 사용시 데드락의 위험성이 존재한다.
A → B가 필요
B → A가 필요