더북(TheBook)

1.5 스레드를 다룰 때 주의 사항

 

 

이번에는 스레드 2개가 값 하나에 동시에 접근하는 경우를 봅시다. 정확히는 스레드 2개가 값 하나를 번갈아 가면서 접근하는 경우입니다. 두 스레드가 한 값에 접근하는 것에 대해 특별한 조치를 하지 않으면 두 스레드가 접근하는 값은 어떤 상태가 될지 아무도 모르는 이상한 결과를 낳을 수도 있습니다. 두 스레드가 데이터에 접근해서 그 데이터 상태를 예측할 수 없게 하는 것을 경쟁 상태 혹은 데이터 레이스(data race)라고 합니다. 이는 ‘가끔’ 부정확하게 연산 결과가 나오게 하는 원인이지요.

예시부터 보겠습니다.

x += y;

이 코드를 두 스레드에서 실행해 봅시다. 여기서 x는 여러 스레드에서 접근할 수 있는 변수입니다.

두 스레드가 동시에 이 코드를 실행한다면, 컨텍스트 스위치로 저 두 연산을 한 줄씩 실행하면 참 좋겠죠. 이렇게 말입니다.

x = 2
# 스레드 1
x += 3
# 스레드 2
x += 4
# 기대하는 결과
x = 9

하지만 실제로 저것을 실행하는 프로그램을 만들어 보면, 9가 나왔다가 다른 값이 나왔다가 합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.