Из Предложение С++ 0x в С++ Atomic Types и Operations:
29.1 Порядок и последовательность [atomics.order]
Добавьте новый подканал со следующими параграфами.
Перечисление
memory_orderуказывает подробный порядок регулярной (неатомарной) синхронизации памяти, как определено в [новом разделе, добавленном N2334 или его принятом преемником], и может предусматривать порядок операций. Его перечисляемые значения и их значения следующие.
memory_order_relaxedОперация не упорядочивает память.
memory_order_releaseВыполняет операцию освобождения в затронутых ячейках памяти, тем самым делая запись регулярной памяти видимой для других потоков через атомную переменную, к которой она применяется.
memory_order_acquireВыполняет операцию получения в затронутых ячейках памяти, тем самым делая регулярную запись в других потоках, выпущенных через атомную переменную, к которой она применяется, видимая текущему потоку.
memory_order_acq_relОперация имеет как семантику получения и выпуска.
memory_order_seq_cstОперация имеет как семантику получения и выпуска, так и, кроме того, имеет последовательное согласование операций.
В предложении ниже:
bool A::compare_swap( C& expected, C desired, memory_order success, memory_order failure ) volatileгде можно указать порядок памяти для CAS.
Я понимаю, что "memory_order_acq_rel" обязательно обязательно синхронизирует те ячейки памяти, которые необходимы для операции, в то время как другие ячейки памяти могут оставаться несинхронизированными (они не будут вести себя как забор памяти).
Теперь, мой вопрос: если я выбираю "memory_order_acq_rel" и применяю compare_swap к целым типам, например целым числам, как это обычно преобразуется в машинный код на современных потребительских процессорах, таких как многоядерный Intel i7? Как насчет других широко используемых архитектур (x64, SPARC, ppc, arm)?
В частности (предполагая конкретный компилятор, скажем gcc):
- Как сравнить и поменять целое местоположение с указанной выше операцией?
- Какая последовательность команд будет вызывать такой код?
- Является ли операция блокировкой на i7?
- Будет ли такая операция работать с протоколом когерентности полного кеша, синхронизируя кеши разных процессорных ядер, как если бы это был забор памяти на i7? Или он просто синхронизирует ячейки памяти, необходимые для этой операции?
- В связи с предыдущим вопросом - есть ли преимущество в производительности для использования семантики
acq_relна i7? Как насчет других архитектур?
Спасибо за все ответы.