Cómo usar std :: atomic eficiente

std :: atomic es una nueva característica introducida por c ++ 11 pero no puedo encontrar mucho tutorial sobre cómo usarla correctamente. Entonces, ¿son comunes y eficientes las siguientes prácticas?

Una práctica que utilicé es que tenemos un búfer y quiero CAS en algunos bytes, así que lo que hice fue:

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));

Así que mis preguntas son:

El código anterior usa reinterpret_cast feo y ¿es esta la forma correcta de recuperar el puntero atómico que hace referencia a la ubicación & buf [índice]? ¿El CAS en un solo byte es significativamente más lento que el CAS en una palabra de máquina, por lo que debo evitar usarlo? Mi código se verá más complicado si lo cambio para cargar una palabra, extraer el byte, calcular y establecer el byte en el nuevo valor, y hacer CAS. Esto hace que el código sea más complicado y también necesito lidiar con la alineación de la dirección.

EDIT: si esas preguntas dependen del procesador / arquitectura, ¿cuál es la conclusión para los procesadores x86 / x64?

Respuestas a la pregunta(6)

Su respuesta a la pregunta