한 줄처럼 보여도 읽기, 증가, 쓰기 세 단계라 두 스레드가 동시에 실행하면 증가가 사라질 수 있습니다.
동기화 문제 시작점
경쟁 조건은 코드가 짧아도 원자적이지 않은 읽기, 수정, 쓰기 사이에 다른 스레드가 들어올 때 발생합니다.
share같은 데이터를 보는가
write하나 이상 수정하는가
interleave중간에 끼어드는가
protect임계 영역으로 묶는가
공유 자원에 접근하는 코드 조각은 한 번에 하나의 실행 흐름만 들어오도록 보호해야 합니다.
같은 임계 영역을 동시에 통과하지 않게 막습니다.
임계 영역이 비어 있는데도 아무도 들어가지 못하는 설계는 올바른 해결책이 아닙니다.
특정 스레드가 계속 밀려나지 않도록 진입 기회가 유한 시간 안에 돌아와야 합니다.
ThreadSanitizer와 Helgrind는 실행 중 실제 데이터 경합 지점을 찾아주는 실무 단서입니다.