Из Предложение С++ 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? Как насчет других архитектур?
Спасибо за все ответы.