2013-05-29 4 views
3

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

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

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

ответ

5

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

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

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

См. http://www.stdthread.co.uk/forum/index.php?topic=72.0 для получения некоторой полезной информации.

2

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

+0

Это было очень полезно. +1. – etherice

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

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