,이 예제에서, 우리는 적어도 두 개의 물리적 코어와 스레드 # 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 일관성 모델에 대해 완전히 잘못 될 수있다, 나는 경우에 저를 수정하시기 바랍니다!
나는 전에 메모리 장벽에 대해들은 적이 있지만 어떻게 사용합니까? 바리케이드가 뭐니? 이건 그냥 컴파일러 트릭인가요? –
메모리 장벽 또는 메모리 펜스는 일반적으로 CPU가 명령을 재정렬하는 것을 금지하기 위해 사용되며 두 부분으로 나뉩니다 : 절반 펜스와 전체 펜스 .. 여기서 설명하는 것은 실제로 큰 주제이지만 메모리에 대한 자세한 내용을 찾을 수 있습니다 장벽 [here] (http://msdn.microsoft.com/en-us/library/ms686355(v=vs.85).aspx) 및 [여기] (http://en.wikipedia.org/wiki/Memory_barrier) –
고마워, 나는 그들을 읽을 것이다. –