У меня есть хорошее концептуальное понимание C ++ 11 std::memory_order
типы (расслабленный против приобрести релиз против последовательно последовательный …), но я бы хотел лучше понять, как они обычно реализуются (компилятором) для целей x86 (или x86_64).
В частности, сравнение подробностей низкого уровня (таких как важные инструкции процессора, связанные с памятью для синхронизации состояния или кэш-память между процессорами) для каждого из ограничений порядка (memory_order_consume
, memory_order_acquire
, memory_order_release
, а также memory_order_seq_cst
).
Пожалуйста, предоставьте как можно больше подробностей низкого уровня, предпочтительно для x86_64 или похожая архитектура. Ваша помощь будет очень ценится.
На x86 и x86_64 нагрузки имеют семантику получения, а хранилища имеют семантику выпуска в любом случае, даже без использования атомики, поэтому все порядки памяти, кроме seq_cst
не требуют никаких специальных инструкций вообще.
Чтобы получить полную последовательную согласованность, компилятор может вставить mfence
Инструкция по предотвращению переупорядочения операций в разных местах памяти, но я не думаю, что нужны какие-либо другие специальные инструкции.
Компиляторы должны избегать перемещения нагрузки и хранения между атомарными операциями, но это чисто ограничение для оптимизаторов компилятора и не требует каких-либо инструкций ЦП.
Увидеть http://www.stdthread.co.uk/forum/index.php?topic=72.0 для некоторой хорошей информации.