Сравнить и поменять местами C ++ 0x

Из предложения C ++ 0x по атомарным типам и операциям C ++:

29.1 Порядок и согласованность [atomics.order]

Добавить новый подпункт со следующими параграфами.

Перечисление memory_order определяет подробный регулярный (неатомарный) порядок синхронизации памяти, как определено в [новый раздел, добавленный N2334 или его принятым преемником], и может обеспечивать порядок операций . Его перечисленные значения и их значения следующие. memory_order успех, memory_order сбой) volatile

, где можно указать порядок памяти для CAS.


Я понимаю, что « memory_order_acq_rel » обязательно синхронизирует только те ячейки памяти, которые необходимы для операции, в то время как другие ячейки памяти могут оставаться несинхронизированными (он не будет вести себя как ограждение памяти.)

Теперь у меня вопрос - если я выберу « memory_order_acq_rel » и применим compare_swap к целым типам, например, целым числам, как это обычно переводится в машинный код на современных потребительских процессорах, таких как многоядерный Intel i7? А как насчет других часто используемых архитектур (x64, SPARC, ppc, arm)?

В частности (предполагая конкретный компилятор, скажем gcc):

  1. Как сравнить и поменять местами целочисленную ячейку с указанной выше операцией?
  2. Какую последовательность инструкций будет производить такой код?
  3. Будет ли операция заблокирована на i7?
  4. Будет ли выполняться такая операция протокол полной согласованности кеша, синхронизирующий кеши разных ядер процессора, как если бы это был забор памяти на i7? Или он просто синхронизирует участки памяти, необходимые для этой операции?
  5. Относится к предыдущему вопросу - есть ли какое-либо преимущество в производительности при использовании семантики acq_rel на i7? А как насчет других архитектур?

Спасибо за все ответы.

16
задан Donal Fellows 18 November 2010 в 11:00
поделиться