실행 순서가 결과를 바꿉니다
공유 변수에 여러 스레드가 동시에 쓰면 최종 값이 매번 달라질 수 있습니다.
counter++처럼 읽기, 증가, 저장이 나뉘는 연산은 보호하지
않으면 손실된 갱신이 발생합니다.
std::lock_guard와 std::unique_lock은
예외가 나도 소멸자에서 unlock을 호출합니다.
std::shared_mutex와
shared lock을 고려합니다.
공유 변수에 여러 스레드가 동시에 쓰면 최종 값이 매번 달라질 수 있습니다.
임계 영역은 짧게 유지해 대기 시간을 줄이고 교착 가능성을 낮춥니다.
여러 뮤텍스는 항상 같은 순서로 잠그거나
std::scoped_lock을 사용합니다.
잠금 범위 뮤텍스는 공유 데이터를 보호하는 경계입니다. 어떤 데이터가 어떤 락으로 보호되는지 함께 문서화해야 합니다.