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

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

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