Как эффективно использовать 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));

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос