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

     

     

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

    예시부터 보겠습니다.

    x += y;

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

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

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

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

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