std :: atomic es una nueva característica introducida por C++ 11 pero no puedo encontrar mucho tutorial sobre cómo usarla correctamente. Entonces, ¿la siguiente práctica es común y eficiente?Cómo usar std :: atomic eficientemente
Una práctica utilicé es que tenemos una memoria intermedia y quiero CAS de 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:
- Los usos de código anteriores reinterpret_cast feo y ¿es esta la forma correcta de recuperar el puntero atómico que hace referencia a la ubicación & buf [index]?
- ¿El CAS en un solo byte es significativamente más lento que CAS en una palabra de máquina, por lo que debería 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 tengo que ocuparme de la alineación de direcciones.
EDITAR: si esas preguntas dependen del procesador/arquitectura, entonces ¿cuál es la conclusión para los procesadores x86/x64?
C++ Concurrencia en acción [(acceso anticipado)] (http://www.manning.com/williams/), [(amazon)] (http://www.amazon.com/gp/product/1933988770/ ref = as_li_qf_sp_asin_tl?ie = UTF8 & tag = gummadoon-20 & linkCode = as2 & camp = 1789 & creative = 9325 & creativeASIN = 1933988770) es probablemente el mejor libro sobre este tema en este momento, o mejor dicho, lo será. – Cubbi
No hay muchos tutoriales sobre átomo porque, aparte de algunos casos simples como banderas atómicas, es un campo minado. Ver "The Hurt Locker" debería ser un prerrequisito para usar atómico. Use bloqueos! –