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
   29   30   31   32   33   34   35   36   37