Как эффективно использовать std :: atomic

std :: atomic - это новая функция, представленная в C ++ 11, но я не могу найти много руководств о том, как ее правильно использовать. Так является ли следующая практика распространенной и эффективной?

Я использовал один из способов: у нас есть буфер и я хочу использовать CAS для некоторых байтов, поэтому я сделал следующее:

uint8_t *buf = ....
auto ptr = reinterpret_cast<std::atomic<uint8_t>*>(&buf[index]);
uint8_t oldValue, newValue;
do {
  oldValue = ptr->load();
  // Do some computation and calculate the newValue;
  newValue = f(oldValue);
} while (!ptr->compare_exchange_strong(oldValue, newValue));

Итак, мои вопросы:

  1. Приведенный выше код использует уродливое reinterpret_cast, и является ли это правильный способ получить атомарный указатель, который ссылается на местоположение & buf [index]?
  2. Является ли CAS в одном байте значительно медленнее, чем CAS в машинном слове, поэтому мне следует избегать его использования ? Мой код будет выглядеть более сложным, если я изменю его для загрузки слова, извлечения байта, вычисления и установки байта в новое значение и выполнения CAS. Это усложняет код, и мне также нужно самому заниматься выравниванием адресов.

РЕДАКТИРОВАТЬ: если эти вопросы зависят от процессора / архитектуры, то каков вывод для процессоров x86 / x64?

23
задан Kan Li 5 January 2012 в 21:30
поделиться