2014-11-27 8 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_cst и std::memory_order_acquire/release является то, что std::memory_order_seq_cst -stores не может быть заказан с последующим std::memory_order_seq_cst -loads к различным переменным/местам, в разделе «Атомные <> Оружие» говорить Герб Саттер. (Конечно, никогда не бывает, чтобы магазины переупорядочивались с последующими нагрузками на одну и ту же переменную.)

Но, как только ослабляется только один (не говоря уже обо всех) из заказов на память (как в случае с оба потока в этом примере) может произойти переупорядочение StoreLoad. Это означает, что в примере обе нагрузки могут быть переупорядочены до их соответствующего хранилища.

Это означает, что программа, которая содержит только одну std::memory_order_seq_cst и в противном случае только std::memory_order_release/acquire остается той же самой программы, если один должны были заменить одинокую std::memory_order_seq_cst на std::memory_order_release (если она с магазином) или std::memory_order_acquire (если это с нагрузка).

 Смежные вопросы

  • Нет связанных вопросов^_^