Synchronization

뮤텍스는 임계 영역에 한 스레드만 들여보냅니다

counter++처럼 읽기, 증가, 저장이 나뉘는 연산은 보호하지 않으면 손실된 갱신이 발생합니다.

RAII 락std::lock_guardstd::unique_lock은 예외가 나도 소멸자에서 unlock을 호출합니다.
공유 읽기읽기는 많고 쓰기가 드문 구조는 std::shared_mutex와 shared lock을 고려합니다.
race

실행 순서가 결과를 바꿉니다

공유 변수에 여러 스레드가 동시에 쓰면 최종 값이 매번 달라질 수 있습니다.

mutex

진입 전 잠그고 나갈 때 풉니다

임계 영역은 짧게 유지해 대기 시간을 줄이고 교착 가능성을 낮춥니다.

deadlock

서로의 락을 기다리며 멈춥니다

여러 뮤텍스는 항상 같은 순서로 잠그거나 std::scoped_lock을 사용합니다.

lock_guard스코프 전체를 단순히 보호할 때 가장 짧고 안전한 RAII 락입니다.
unique_lock조건 변수 대기, 지연 잠금, 수동 unlock처럼 유연성이 필요할 때 사용합니다.
scoped_lockC++17부터 여러 뮤텍스를 한 번에 잠가 데드락 위험을 줄입니다.

잠금 범위 뮤텍스는 공유 데이터를 보호하는 경계입니다. 어떤 데이터가 어떤 락으로 보호되는지 함께 문서화해야 합니다.