경쟁 조건은 같은 값을 동시에 읽고 쓰며 발생합니다
counter++는 읽기, 계산, 쓰기의 세 단계입니다. 두
스레드가 이 단계를 겹쳐 실행하면 증가가 사라지고, 뮤텍스와 RAII
락은 그 구간을 한 번에 한 스레드만 지나가게 합니다.
counter
모든 스레드가 함께 수정하는 변수
락이 없을 때: Lost Update
위험
Thread A
counter 값을 7로 읽습니다.
read 7
Thread B
A가 쓰기 전에 같은 값 7을 읽습니다.
read 7
두 스레드
각자 8을 계산합니다.
7 + 1
마지막 쓰기
둘 다 8을 저장해 증가 1회가 사라집니다.
write 8
!
예상 9, 실제 8
실행 순서에 따라 결과가 달라지는 경쟁 조건입니다.
뮤텍스와 락: 임계 영역 직렬화
보호
락 객체 생성
스코프 시작에서 mutex를 잠급니다.
lock_guard
Thread A 진입
임계 영역에서 counter를 7에서 8로 바꿉니다.
7 -> 8
Thread B 대기
같은 mutex가 풀릴 때까지 임계 영역 밖에서 기다립니다.
wait
자동 해제
B가 새 값 8을 읽고 9로 저장합니다.
8 -> 9
✓
항상 2회 증가
공유 자원 접근 순서를 하나로 만들어 결과를 안정화합니다.