OS 동기화: Race Condition

counter++는 한 줄이지만 원자적 연산이 아니다

두 스레드가 같은 공유 변수에 읽기, 수정, 쓰기를 동시에 수행하면 실행 순서에 따라 하나의 증가가 유실될 수 있습니다.

교차 실행 타임라인

LOAD 메모리의 counter를 레지스터로 읽음
ADD 레지스터 값에 1을 더함
STORE 계산 결과를 다시 메모리에 씀
시간
Thread A
Thread B
공유 counter
1
LOAD R1 = 0
0 아직 변경 없음
2
LOAD R2 = 0
0 같은 값을 읽음
3
ADD R1 = 1
0 레지스터만 바뀜
4
ADD R2 = 1
0 메모리는 그대로
5
STORE counter = R1
1 A의 증가 반영
6
STORE counter = R2
1 기대값은 2

경쟁 조건이 생기는 세 조건

1 공유 데이터 접근

여러 스레드나 프로세스가 같은 메모리, 파일, 레코드에 접근합니다.

2 최소 하나는 쓰기

읽기만 있다면 값이 깨지지 않습니다. 위험은 읽기와 쓰기가 섞일 때 생깁니다.

3 동기화 없음

실행 순서를 제어하지 않으면 타이밍에 따라 결과가 달라집니다.