C++ mutex와 lock

락은 보호할 데이터와 같은 수명 경계에 배치한다

뮤텍스는 코드 줄을 보호하는 것이 아니라 공유 상태의 불변식을 보호한다. 임계 구역을 최소화하되, lock/unlock 짝은 RAII lock 객체로 관리해야 예외 경로에서도 안전하다.

01

공유 상태 식별

어떤 데이터가 여러 스레드에서 읽고 쓰이는지 먼저 표시한다.

보호 대상
02

락 획득

데이터 접근 직전에 lock_guard나 unique_lock으로 획득한다.

수동 unlock 줄이기
03

상태 변경

불변식이 깨지는 중간 상태는 락 안에 숨긴다.

원자적 전이
04

락 해제

스코프 종료로 자동 해제하고 오래 걸리는 I/O는 가능하면 락 밖에서 한다.

대기 줄이기
lock_guard
단순 스코프 락 생성 시 lock, 소멸 시 unlock이라 예외에도 안전하다.
기본 선택
unique_lock
유연한 락 제어 defer_lock, unlock/relock, condition_variable wait에 필요하다.
조건 변수
scoped_lock
여러 mutex 동시 획득 교착을 피하는 방식으로 여러 락을 함께 잡는다.
C++17
atomic
단일 값 동기화 단일 카운터는 mutex보다 atomic이 맞을 수 있지만 복합 불변식은 어렵다.
메모리 순서

락 순서 · 데이터와 mutex · 락 범위 점검

락 순서 여러 mutex를 잡는 모든 경로가 같은 순서를 지키는지 확인한다.
데이터와 mutex 보호 데이터와 mutex가 같은 객체에 묶여 우회 접근이 없는지 본다.
락 범위 잠근 채 콜백이나 외부 코드를 호출해 재진입 위험을 만들지 않는지 검토한다.