Page 34 -
P. 34
1.5 스레드를 다룰 때 주의 사항 GAM E SE RVER
이번에는 스레드 2개가 값 하나에 동시에 접근하는 경우를 봅시다. 정확히는 스레드 2개가 값 하
나를 번갈아 가면서 접근하는 경우입니다. 두 스레드가 한 값에 접근하는 것에 대해 특별한 조치
를 하지 않으면 두 스레드가 접근하는 값은 어떤 상태가 될지 아무도 모르는 이상한 결과를 낳을
수도 있습니다. 두 스레드가 데이터에 접근해서 그 데이터 상태를 예측할 수 없게 하는 것을 경쟁
상태 혹은 데이터 레이스(data race)라고 합니다. 이는 ‘가끔’ 부정확하게 연산 결과가 나오게 하는
원인이지요.
예시부터 보겠습니다.
x += y;
이 코드를 두 스레드에서 실행해 봅시다. 여기서 x는 여러 스레드에서 접근할 수 있는 변수입니다.
두 스레드가 동시에 이 코드를 실행한다면, 컨텍스트 스위치로 저 두 연산을 한 줄씩 실행하면 참
좋겠죠. 이렇게 말입니다.
x = 2
# 스레드 1
x += 3
# 스레드 2
x += 4
# 기대하는 결과
x = 9
하지만 실제로 저것을 실행하는 프로그램을 만들어 보면, 9가 나왔다가 다른 값이 나왔다가 합니다.
앞서 이야기했듯이 컨텍스트 스위치는 기계어 단위로 자릅니다. 따라서 이 코드를 기계어로 컴파
일하면 다음과 같습니다.
t1 = x
t1 = t1 + 3
x = t1
자, 이 기계어 세 줄을 스레드 2개가 실행합니다. 그리고 실행하는 도중에 컨텍스트 스위치가 발
생합니다. 언제 컨텍스트 스위치가 발생할지는 모릅니다. 다음과 같이 발생했다고 칩시다.
042