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