C++

뮤텍스(Mutex) - lock()과 unlock()

seungwoo-dev 2025. 2. 25. 16:19

1. Mutex는 "Mutual Exclusion"의 약자로, 여러 스레드가 공유 자원에 동시에 접근하지 못하도록 하는 동기화 기법입니다.

 

2. lock()은 멀티스레딩 환경에서 뮤텍스(Mutex)를 사용할 때 자주 등장하는 함수입니다.

lock() 함수는 뮤텍스를 잠그는(locking) 역할을 합니다. 이를 통해 공유 자원에 대한 동시 접근을 방지하고, 한 번에 하나의 스레드만 해당 자원을 사용할 수 있도록 보장합니다.

 

<기본 동작 원리>

 1) 뮤텍스 생성: 먼저, 공유 자원을 보호할 뮤텍스를 생성합니다.

 2) lock() 호출: 스레드가 lock()을 호출하면, 해당 뮤텍스를 잠급니다. 이때 다른 스레드가 이미 뮤텍스를 잠그고 있다면, 현재 스레드는 뮤텍스가 풀릴 때까지 대기하게 됩니다.

 3) unlock() 호출: 스레드가 작업을 마친 후 unlock()을 호출하여 뮤텍스를 풀면, 대기 중인 다른 스레드가 뮤텍스를 얻고 자원에 접근할 수 있게 됩니다.

 

#예시 (C++)

이 예제에서 lock() 과 unlock() 을 사용하여, 두 스레드가 std::cout 을 동시에 출력하지 않도록 합니다.

 

 

# lock() 과 unlock() 사용 시 주의 사항

 - 데드락(Deadlock) 방지 : 여러 뮤텍스를 사용하거나 lock()과 unlock()을 잘못 사용하면, 데드락이 발생할 수 있습니다. 데드락은 두 개 이상의 스레드가 서로 다른 뮤텍스를 기다리며 무한정 대기하는 상황입니다. 이를 피하려면 뮤텍스 사용 순서를 일관되게 유지하는 것이 중요합니다.

 

3. lock_guard: C++에서는 std::lock_guard와 같은 RAII 기반의 동기화 도구를 사용하여, lock()과 unlock()을 명시적으로 호출하는 대신 자동으로 잠금과 해제를 처리하는 방법도 있습니다. 이 방식은 예외 처리와 함께 뮤텍스를 안전하게 사용할 수 있습니다.

 

#예시 (C++, lock_guard 사용)

이 방법은 예외가 발생해도 자동으로 unlock() 이 호출되므로 안전합니다.

 

※ join() 함수는 Thread가 종료될 때까지 현재 실행 중인 Thread를 기다리게 만드는 함수입니다.

즉, join()을 호출한 Thread는 다른 Thread가 종료될 때까지 블로킹(blocking) 상태로 기다리게 됩니다.

 

요약

 - lock()은 뮤텍스를 잠그는 함수로, 한 스레드가 자원에 접근할 때 다른 스레드가 접근하지 못하도록 방지합니다.

 - unlock()을 통해 자원 사용이 끝난 후 다른 스레드가 접근할 수 있게 합니다.

 - 잘못 사용하면 데드락을 일으킬 수 있으므로 주의가 필요합니다.