어떤 위치에 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"의 두 번일 수 있습니까?