2011-08-20 2 views
4

,이 예제에서, 우리는 적어도 두 개의 물리적 코어와 스레드 # 1과 # 2는 자신의 CPU 코어 (참 병렬)에서 실행되고있는 X86 시스템에있어 있으리라 믿고있어 :멀티 스레딩과 일관성 모델 여기

[initial state] 
shared_memory_location = 0; 

[thread #1] 
shared_memory_location = 1; 
signal(); 

[thread #2] 
wait_for_signal(); 
print(shared_memory_location); 

스레드 # 2의 shared_memory_location의 값은 무엇입니까?

이것은 0 또는 1 일 수 있지만 X86의 일관성 모델은 메모리 위치 쓰기 이후의 모든 읽기가이 읽기가 발생하는 CPU 코어에 관계없이 새 값을 읽음을 보장합니다.

는 x86 일관성 모델은 스레드 # 2를 실행하는 두 번째 물리적 코어가 CPU 코어 전용 캐시에서 유효하지 않은 값을 선택하지 않도록합니다. X86을 사용하면이 작업이 훨씬 쉬워 지지만 ARM과 같은 다른 시스템이 이러한 방식으로 작동한다는 보장은 없습니다.

당신은 당신이 그것이 스레드 # 1에서 시그널링되는 새 값을 읽을 수 있었다 스레드 번호를 확인 얼마나 X86의 일관성 모델을 사용하지 않은 경우?

점에

... 이상, 어떻게 올바른 방식으로 신호에 대기중인 스레드에 당신에게 값의 손을?

면책 조항 : 나는 X86 일관성 모델에 대해 완전히 잘못 될 수있다, 나는 경우에 저를 수정하시기 바랍니다!

답변

0

signal()wait_for_signal() 방법은 내부 메모리 장벽을 호출하는 경우, 다음 시나리오는 때문에 메모리 장벽 호출, 의지조차 ARM에서 발생 설명은 상기 예 대신 개인의 핵심 캐시의 메인 메모리에 데이터를 플러시 signal 방법 shared_memory_location는 "휘발성 쓰기"가됩니다 그래서는 메인 메모리에 데이터를 플러시합니다, 또한 그렇게 shared_memory_location을 읽는 것은 "휘발성 읽기"가 될 것이라고 wait_for_signal 후 메인 메모리에 데이터를 플러시합니다.

+0

나는 전에 메모리 장벽에 대해들은 적이 있지만 어떻게 사용합니까? 바리케이드가 뭐니? 이건 그냥 컴파일러 트릭인가요? –

+0

메모리 장벽 또는 메모리 펜스는 일반적으로 CPU가 명령을 재정렬하는 것을 금지하기 위해 사용되며 두 부분으로 나뉩니다 : 절반 펜스와 전체 펜스 .. 여기서 설명하는 것은 실제로 큰 주제이지만 메모리에 대한 자세한 내용을 찾을 수 있습니다 장벽 [here] (http://msdn.microsoft.com/en-us/library/ms686355(v=vs.85).aspx) 및 [여기] (http://en.wikipedia.org/wiki/Memory_barrier) –

+0

고마워, 나는 그들을 읽을 것이다. –