➌을 실행하다가 C++ 예외를 던지면(throw) ➍~➏은 실행되지 못합니다. 이를 해결하려면 try-catch 구문으로 감싸 예외가 발생하더라도 unlock()을 실행할 수 있게 해야 합니다. 벌써 귀찮지 않나요?
C++에서는 로컬 변수가 파괴될 때, 파괴자 함수에서 여러분이 원하는 코드가 실행되게 할 수 있습니다. 이를 이용하면 예외 던짐이 발생하더라도 파괴자 함수로 unlock()이 자동으로 실행될 것입니다.
C++에서는 뮤텍스 잠금 상태를 로컬 변수로 저장하고, 그 변수가 사라질 때 자동으로 잠금 해제가 되게 하는 클래스를 제공합니다. 바로 lock_guard입니다.
코드 lock_guard 사용 예
std::recursive_mutex mx; lock_guard<recursive_mutex> lock(mx); read(x); write(x); sum(x);
이렇게 하면 로컬 변수 lock 객체가 사라질 때 자동으로 mx.unlock()이 실행됩니다.
C# 언어에서는 lock과 unlock을 할 때 다음과 같이 합니다.
1. 보호하려는 변수 자체를 뮤텍스처럼 사용하여 잠급니다. 혹은 변수를 가리키는 임의의 객체를 따로 만들어 그 객체를 잠급니다(lock).
2. 다 쓰고 나면 잠금을 해제합니다(unlock).