1
float myTotalAmount=0; 
void update(float amt){ 
    myTotalAmount+= amt; 
} 

작업 A 전화 update(10);컨텍스트 스위치가 변수 수정에 어떻게 영향을 미칠 수 있습니까?

작업 B 호출 update(5);

어떻게 조건이 myTotalAmount의 결과에 영향을 경주 할 수 있습니까? 태스크 A이 완료되기 전에

작업 B은 몇 가지 이유로 인해에 컨텍스트 스위치가 발생하기 때문에 업데이트 메소드를 호출 할 수 있습니다?

전체적으로 나는 race condition을 이해하려고합니다.

+0

나는이 질문을 cs.stackexchange.com에 속하기 때문에이 질문을 주제로 끝내기 위해 투표하고 있습니다. –

답변

1

int myTotalAmount = 0

태스크 A

Updata(10);

태스크 B

Updata(5)


myTotalAmount+= amt;은 원자 적 연산이 아닙니다. 이 줄은 여러 기계 명령으로 변환됩니다. 말했다되고 그건

, 작업 A는 컨텍스트 스위치가 지금 happends 및 Task B 시작은 이제 OS가 결정이 5로 myTotalAmount을 수정합니다 실행하면 그 값은 0이됩니다, 레지스터에 myTotalAmount의 값을 저장합니다 다시 Task A을 실행하십시오. myTotalAmount의 값이 5인데도 이미 값을 추출하여 레지스터에 저장했으며 0이었습니다. 실행은 myTotalAmount0 인 지점부터 계속됩니다. 이제 myTotalAmount0+10이 할당되고 15 대신 10이됩니다.

이 문제를 해결하려면 동기화를 적용하여 경쟁 조건을 방지 할 수 있습니다. 자물쇠를 사용할 수 있습니다.