더북(TheBook)

앞서 이야기했듯이 컨텍스트 스위치는 기계어 단위로 자릅니다. 따라서 이 코드를 기계어로 컴파일하면 다음과 같습니다.

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) 발생하다 보니 결과를 예측할 수 없습니다.

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