최신 CPU는 의사 코드를 실행하는 경우와 같이 업데이트 된 순서대로 메모리에 데이터를 항상 쓰는 것은 아닙니다 (단순화를 위해 변수가 메모리에 항상 저장된다고 가정). 이 메모리에 a
을 쓰기 전에
a = 1
b = a + 1
... CPU는 아주 잘 메모리에
b
을 쓸 수 있습니다. 위의 코드를 실행하는 스레드는 할당이 이루어지면 어느 한 변수의 이전 값을 결코 볼 수 없으므로 실제로는 단일 스레드에서 작업을 실행하는 한 실제로는 문제가되지 않습니다.
멀티 쓰레딩은 또 다른 문제입니다. 다음 코드를 사용하면 다른 쓰레드가 무거운 계산의 가치를 찾게 될 것입니다.
a = heavy_computation()
b = DONE
... 다른 스레드 일 ... 비록 완료 플래그가 결과 이전에 메모리에 설정 될 수 있는지의 문제는 메모리에 저장된다
repeat while b != DONE
nothing
result = a
때문에 다른 스레드
계산 결과가 메모리에 기록되기 전에 메모리 주소 a의 값을 취할 수 있습니다.
같은 문제가 것 - Thread.start
경우 Thread.join
가 없었다 보증 "전에 발생"- 당신에게 같은 코드에 문제를 줄; 스레드가 시작될 때
a = 1
Thread.start newthread
...
newthread:
do_computation(a)
...
a
때문에 메모리에 저장되어있는 값을 가질 수있다.
당신은 거의 항상 새로운 스레드가 Thread.start
를 호출하기 전에 업데이트되었습니다 데이터를 사용할 수 보장, 즉, Thread.start
가가 보장 "하기 전에 발생"을 가지고, 당신이 그것을 시작하기 전에 초기화 된 데이터를 사용할 수 있도록 원하기 때문에 새 스레드.Thread.join
에 대해서도 마찬가지입니다. 여기서 새 스레드에 의해 작성된 데이터는 종료 후 연결된 스레드에 표시 될 수 있습니다..
그냥 스레딩을 훨씬 쉽게 만듭니다.
'happen-before relationship'은 이러한 명령문 집합이 다른 명령문 집합보다 먼저 실행된다는 것을 의미합니다. 따라서 첫 번째 시나리오에서 ... 새 스레드 시작에 이르는 명령문은 새로 시작된 스레드에 의해 실행될 명령문과 happen-before 관계를가집니다. 이러한 명령문에 의한 모든 변경 사항은 스레드가 실행 한 명령문에서 볼 수 있습니다. –
이 페이지가 도움이됩니다. http://preshing.com/20130702/the-happens-before-relation/ A와 B 사이의 "happen-before"관계가 B 이전에 실제로 발생하는 A와 어떻게 다른지 예제를 제공합니다. –