2012-11-12 3 views
0

공유 메모리에 동시에 두 스레드 실행 (모든 변수는 두 개의 스레드간에 공유 이다)
스레드

for (i=0; i<5; i++) { 
    x = x + 1; 
} 

스레드 B가 스레드

for (j=0; j<5; j++) { 
    x = x + 2; 
} 

단일 프로세서 시스템 가정
a- 간결한 프로 제공 두 스레드가 모두 완료된 이유는 x≤15입니다.
b- 우리는 X = x-1로 X를 x = x-2로 대체한다고 가정합니다.

이 질문을 이해하지 못하고 대답을 찾았지만 할 수 있습니다. 그것을 얻지 마라 나는 그것을 설명하고 싶다.

+0

Stackoverflow는 숙제를하는 사람들을 돕는 데 열렬한 경향이 있지만 그대로 태그를 지정하십시오. – gbtimmon

+1

@gbtimmon - 사실, [숙제] 태그는 이제 쓸모가 없습니다. – ArjunShankar

+3

@gbtimmon 숙제 태그가 사용되지 않으며 더 이상 사용되지 않습니다. – Joe

답변

4

스레딩이 완벽하게 작동하는 경우 'x'값의 최대 값은 15입니다.이 값은 모두 운영 체제의 스케줄러에 따라 다릅니다.

x의 초기 값이 0이라고 가정합니다. 스레드 A와 스레드 B가 직렬화됩니다. 스레드 B로가 x의 값은 지금 15

i | x 
------- 
0 | 7 
1 | 9 
2 | 11 
3 | 13 
4 | 15 

최종 값 X를 수득 5 것이다 스레드 A 후, x의 값은 제

i | x 
------- 
0 | 1 
1 | 2 
2 | 3 
3 | 4 
4 | 5 

것이다 완료 일은 일반적으로 이런 식으로 발생하지 않으며 스레드는 x의 초기 값을 읽고 그 값을 더한 다음 수정 된 값을 다시 메모리에 씁니다. 다음과 같은 일이 발생할 수 있습니다.

Thread A reads the value 'x' as 0 
Thread B reads the value 'x' as 0 
Thread A adds 1 to x making its local copy of x, 1 
Thread B adds 2 to x making its local copy of x, 2 
Thread A writes its modified value of x as 1 
Thread B writes its modified value of x as 2 (overwriting Thread A's modification) 

그러므로 x는 15를 넘지 않지만 스케줄러에 따라 적습니다.

+0

이것은 일반적으로 '경쟁 조건'이라고합니다. http://en.wikipedia.org/wiki/Race_condition – gbtimmon

+0

감사합니다. 감사합니다. – Suzana

+0

좋은 설명을 +1했습니다. – Ayse

2

a) 조작법 x=x+1 낮은 레벨에서 단일 명령어가없고 그러므로, 리드 (X)의 순서로 구성 X에 1을 추가 한 후, X의 메모리를 업데이트. 따라서 두 개의 스레드가 x의 동일한 값을 읽게 될 수도 있습니다.

가정 두 스레드이 원인 X X < 15

b) x의 동일한 이유 값 는 0 일 수있다 후 X를 갱신 위로 물품 변수 x의 동일한 값을 읽으면 지시가 x=x-1 인 경우 5.


자세히 알아보기!
-S option으로 C 코드를 컴파일하면 프로그램에 대해 컴파일 된 어셈블 코드가 생성됩니다. 그런 다음 understand x = x + 1 is not a single instruction 수 있습니다. 그리고 스레드 간의 전환은 x = x + 1 명령의 완료 전에 가능할 수 있으므로 원자가 아닙니다.