Код: Выделить всё
-- Initially --
std::atomic x{0};
std::atomic y{0};
-- Thread 1 --
x.store(1, std::memory_order_release);
-- Thread 2 --
y.store(2, std::memory_order_release);
-- Thread 3 --
int r1 = x.load(std::memory_order_acquire); // x first
int r2 = y.load(std::memory_order_acquire);
-- Thread 4 --
int r3 = y.load(std::memory_order_acquire); // y first
int r4 = x.load(std::memory_order_acquire);
Мы все согласны с тем, что с помощью std :: memory_order_seq_cst странный результат не будет разрешен в C ++ 11. Теперь Херб Саттер сказал в своем знаменитом атомке -weapons Talk @ 42:30, что std :: memory_order_seq_cst похоже на std :: memory_order_acq_rel , но std :: memory_acquire -lods может не перемещаться перед STD :: memory_rode_rode_rode_rode_rodes Я не вижу, как это дополнительное ограничение в приведенном выше примере предотвратит странный результат . Кто -нибудь может объяснить?
Подробнее здесь: https://stackoverflow.com/questions/278 ... ays-be-see
Мобильная версия