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