락 해제 책임을 스코프 규칙에 맡깁니다
직접 lock()과 unlock()을 짝지어 쓰면 예외,
조기 반환, 분기에서 해제를 놓치기 쉽습니다. RAII 락 객체는 생성과
소멸에 잠금 생명주기를 묶습니다.
RAII 잠금 생명주기
mutex ownership
락 객체 생성
생성자가 mutex 소유권을 얻습니다.
std::lock_guard
임계 영역 실행
공유 데이터 변경 코드는 잠긴 범위 안에만 둡니다.
counter++
모든 종료 경로
정상 종료,
return, 예외가 같은 스코프 출구로 모입니다.
normal / return / throw
소멸자에서 자동 해제
스택 풀기 중에도 mutex가 풀려 대기 스레드가 진행합니다.
~lock_guard()