현재 C++0x draft 섹션 29.3.9에 주와 29.3.10, 페이지 1111에서 1112 사이를 주문 메모리 그 다음 예제 :C++ 0X :
// Thread 1
r1 = y.load(memory_order_relaxed);
x.store(1, memory_order_relaxed);
// Thread 2
r2 = x.load(memory_order_relaxed);
y.store(1, memory_order_relaxed);
결과물 r1 = r2 = 1
이의 작업 때문에 가능하다 각 스레드는 완화되어 있고 관련이없는 주소입니다. 이제 내 질문에 다음과 같은 (비슷한) 예의 가능한 결과에 관한 것입니다 :
// Thread 1
r1 = y.load(memory_order_acquire);
x.store(1, memory_order_release);
// Thread 2
r2 = x.load(memory_order_acquire);
y.store(1, memory_order_release);
나는이 경우 결과 r1 = r2 = 1
이 불가능하다고 생각합니다. 가능하다면, y의로드는 저장소와 동기화되어 y에 저장됩니다. x와 유사하게 x의로드가 x에 저장되기 전에 발생합니다. 그러나 y의로드는 x에 저장되기 전에 순서가 지정됩니다 (따라서 이전에도 발생합니다). 이것은 허용되지 않는 순환 발생 - 이전 관계를 만듭니다. (만약 당신이 좋아하면, 또는 명령 시퀀스를) 우리가 코드를 읽는처럼 아래로 흐르는 시간이 걸릴 경우
문제는 당연히 투기성 매장과 관련이 없으므로 제목을 변경했습니다. 투기성 상점의 경우 http://stackoverflow.com/questions/2001913/c0x-memory-model-and-speculative-loads-stores – janneb
결과 'r1 = r2 = 1'은 상점을 필요로하기 때문에 상점 추측이 키워드입니다. 두 가지 읽기 전에 재정렬 ("추측")되어야합니다. 제목이 너무 모호합니다. –
C++ 0x 작업 보고서 컨텍스트의 추측 저장소는 컴파일러 추측을 나타냅니다. 이전 주석에서 링크 된 질문을 참조하십시오. 귀하의 질문은 하드웨어가 (하드웨어 아키텍처가 구현하는 공유 메모리 일관성 모델에 따라) 하드웨어를 재주문하는 것과 C++ 0x가 다양한 메모리 장벽 지침을 발행하여이 메모리 재주문을 제한하는 기능을 제공하는 방법과 관련이 있습니다. 따라서 나는 내가 제공 한 제목이 원래 것보다 더 적절하다고 느낀다. 하지만 이봐, 네 질문이기 때문에 네가 원하는대로 바꿔라. – janneb