std:: atomic - новая функция, введенная С++ 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. Это делает код более сложным, и мне также нужно иметь дело с выравниванием адресов.
EDIT: если эти вопросы зависят от процессора/архитектуры, то какой вывод для процессоров x86/x64?