Как барьеры памяти C ++ 11 реализованы для x86-подобных систем?

У меня есть хорошее концептуальное понимание C ++ 11 std::memory_order типы (расслабленный против приобрести релиз против последовательно последовательный …), но я бы хотел лучше понять, как они обычно реализуются (компилятором) для целей x86 (или x86_64).

В частности, сравнение подробностей низкого уровня (таких как важные инструкции процессора, связанные с памятью для синхронизации состояния или кэш-память между процессорами) для каждого из ограничений порядка (memory_order_consume, memory_order_acquire, memory_order_release, а также memory_order_seq_cst).

Пожалуйста, предоставьте как можно больше подробностей низкого уровня, предпочтительно для x86_64 или похожая архитектура. Ваша помощь будет очень ценится.

3

Решение

На x86 и x86_64 нагрузки имеют семантику получения, а хранилища имеют семантику выпуска в любом случае, даже без использования атомики, поэтому все порядки памяти, кроме seq_cst не требуют никаких специальных инструкций вообще.

Чтобы получить полную последовательную согласованность, компилятор может вставить mfence Инструкция по предотвращению переупорядочения операций в разных местах памяти, но я не думаю, что нужны какие-либо другие специальные инструкции.

Компиляторы должны избегать перемещения нагрузки и хранения между атомарными операциями, но это чисто ограничение для оптимизаторов компилятора и не требует каких-либо инструкций ЦП.

Увидеть http://www.stdthread.co.uk/forum/index.php?topic=72.0 для некоторой хорошей информации.

5

Другие решения

Херб Саттер (Herb Sutter) разбил это на x86, а другие архитектуры, включая PowerPC и ARM, были атомное<> Оружие переговоры с C ++ и после 2012 года. Я думаю, что соответствующие слайды в второй часть, кроме первый часть также стоит посмотреть.

2

По вопросам рекламы [email protected]