2010-05-26 8 views
5

현재 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에 저장되기 전에 순서가 지정됩니다 (따라서 이전에도 발생합니다). 이것은 허용되지 않는 순환 발생 - 이전 관계를 만듭니다. (만약 당신이 좋아하면, 또는 명령 시퀀스를) 우리가 코드를 읽는처럼 아래로 흐르는 시간이 걸릴 경우

+0

문제는 당연히 투기성 매장과 관련이 없으므로 제목을 변경했습니다. 투기성 상점의 경우 http://stackoverflow.com/questions/2001913/c0x-memory-model-and-speculative-loads-stores – janneb

+0

결과 'r1 = r2 = 1'은 상점을 필요로하기 때문에 상점 추측이 키워드입니다. 두 가지 읽기 전에 재정렬 ("추측")되어야합니다. 제목이 너무 모호합니다. –

+0

C++ 0x 작업 보고서 컨텍스트의 추측 저장소는 컴파일러 추측을 나타냅니다. 이전 주석에서 링크 된 질문을 참조하십시오. 귀하의 질문은 하드웨어가 (하드웨어 아키텍처가 구현하는 공유 메모리 일관성 모델에 따라) 하드웨어를 재주문하는 것과 C++ 0x가 다양한 메모리 장벽 지침을 발행하여이 메모리 재주문을 제한하는 기능을 제공하는 방법과 관련이 있습니다. 따라서 나는 내가 제공 한 제목이 원래 것보다 더 적절하다고 느낀다. 하지만 이봐, 네 질문이기 때문에 네가 원하는대로 바꿔라. – janneb

답변

4

후 나의 이해는

  • 취득 울타리는 다른 메모리가 울타리를지나 아래로 이동 액세스 할 수 있다는 것입니다 , 이형 울타리 수 있지만 위쪽으로 울타리
  • 과거 다른 메모리 울타리를지나 위쪽으로 이동 액세스,하지만 아래 울타리 지난

즉, 당신이

같은 코드가있는 경우

메모리 액세스는 획득/릴리스 쌍 외부에서 내부로 이동할 수 있지만 반대 방향으로는 이동할 수 없습니다. 또한 획득/릴리스 쌍을 완전히 건너 뛸 수 없습니다.

질문의 첫 번째 예에서 편안한 일관성 의미론을 사용하면 하드웨어가로드 전에 메모리 시스템에 들어가도록 저장소를 재정렬 할 수 있으므로 r1 = r2 = 1이됩니다. 두 번째 예제에서 획득/릴리스 의미론을 사용하면 해당 순서가 변경되지 않으므로 r1 = r2 = 1이 불가능합니다.

+0

나는 당신의 답을 이해할 수 있을지 확신하지 못합니다. –

+0

흠, 내 설명이 도움이됩니까? 그렇지 않다면 무엇을 구체적으로 이해하지 못합니까? – janneb

+0

내 두 번째 예를 들어, relaxeds로 출시를 대체하고, acquires는 acquays를 유지합니다. r1 = r2 = 1입니까? 이제 두 번째 예제의 초기 버전에서 다시 시작합니다. 그러나 이번에는 relaxed로 유지하고 release를 그대로 유지합니다. r1 = r2 = 1입니까? –