2014-11-27 6 views
1

어떤 위치에 std::memory_order_release이있는 상점은 std::memory_order_acquire으로 다른 위치의 후속로드와 다시 정렬 할 수 있습니다.C++ 11의 연속 순차로드와 함께 상점 릴리스를 재정렬 할 수 있습니까?

그러나 어떤 위치에 std::memory_order_release이있는 상점은 std::memory_order_seq_cst으로 다른 위치에서 다음에로드 할 때 다시 정렬 할 수 있습니까?

비슷하게 변수에 대한 std::memory_order_seq_cst의 저장소는 std::memory_order_acquire 인 다른 위치의 후속로드와 다시 정렬 할 수 있습니까?

이 예를 고려

것은 잘 알려져
std::atomic<int> x{0}; 
std::atomic<int> y{0}; 

void thread1() { 
    x.store(std::memory_order_release, 1); 
    int r1 = y.load(std::memory_order_seq_cst); 
    std::cout << r1 << std::endl; 
} 

void thread2() { 
    y.store(std::memory_order_seq_cst, 1); 
    int r2 = x.load(std::memory_order_acquire); 
    std::cout << r2 << std::endl; 
} 

(http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/) 모두 std::memory_order_seq_cst가 해제로 대체된다면/출력을 두 번 "0"이 될 수있는 상대를 취득있다.

순차 일관성은이 예제에서 구매하거나 출력이 여전히 "0"의 두 번일 수 있습니까?

답변

2

아니요, 순차적 일관성은이 예제에서 아무 것도 구입하지 않으며 출력은 여전히 ​​두 번 "0"이 될 수 있습니다.

std::memory_order_seq_cststd::memory_order_acquire/release 사이의 유일한 차이는 -stores std::memory_order_seq_cst다른 변수/위치 후속 std::memory_order_seq_cst -loads로 재 배열 될 수 있다는 것이다, 허브 서터의 "원자 <> 무기"토크를 참조. (물론, 동일한 변수에 대한 후속로드로 상점을 다시 정렬하지 않을 수도 있습니다.) 메모리 주문 중 단 하나만 (둘 모두는 말할 것도없고) 약화됩니다하자마자 (예 : 이 예에서 두 스레드 모두) StoreLoad 재정렬이 발생할 수 있습니다. 즉,이 예에서 두로드는 각각의 상점 이전에 다시 정렬 될 수 있습니다. 하나 (이 상점에있는 경우) std::memory_order_release으로 외로운 std::memory_order_seq_cst 교체하거나한다면

에만 달리 단일 std::memory_order_seq_cststd::memory_order_release/acquire 포함 된 프로그램과 동일한 프로그램이 유지 수단 std::memory_order_acquire (그것과이면 하중).