앞서 이야기했듯이 컨텍스트 스위치는 기계어 단위로 자릅니다. 따라서 이 코드를 기계어로 컴파일하면 다음과 같습니다.
t1 = x t1 = t1 + 3 x = t1
자, 이 기계어 세 줄을 스레드 2개가 실행합니다. 그리고 실행하는 도중에 컨텍스트 스위치가 발생합니다. 언제 컨텍스트 스위치가 발생할지는 모릅니다. 다음과 같이 발생했다고 칩시다.
x = 2 # 스레드 1 t1 = x // t1 = 2 t1 = t1 + 3 // t1 = 5 x = t1 // x = 5 # 스레드 2 t2 = x // t2 = 5 t2 = t2 + 4 // t2 = 9 x = t2 // x = 9
우리가 원하는 결과가 나오네요. 하지만 이렇게 실행된다면 어떻게 될까요?
x = 2 # 스레드 1 t1 = x // t1 = 2 t1 = t1 + 3 // t1 = 5 # 스레드 2 t2 = x // t2 = 2 t2 = t2 + 4 // t2 = 6 x = t2 // x = 6 # 스레드 1 x = t1 // x = 5
x에는 9가 아닌 5가 들어갑니다. 슬프게도 컨텍스트 스위치가 무작위로(random) 발생하다 보니 결과를 예측할 수 없습니다.