Магазин с 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»?