Conozco las operaciones atómicas integradas de GCC: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html¿Mejor forma de implementar una carga atómica genérica o almacenar en GCC?
Pero esta lista no incluye operaciones muy simples como cargar y almacenar. Podría poner en práctica estas en arquitecturas limitadas con ensamblador en línea (de hecho por muchos como x86 serán básicamente sólo mov de regular), pero ¿hay nada mejor en el caso general que algo como esto:
// returns the value at ptr
void *atomic_load_ptr(void **ptr)
{
return __sync_fetch_and_add(ptr, 0);
}
// returns old value int ptr after setting it to newval
void *atomic_store_ptr(void **ptr, void *newval)
{
void *oldval = atomic_load_ptr(ptr)
void *oldval2;
do {
oldval2 = oldval;
} while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
return oldval;
}
Detente si me equivoco, pero la función de "tienda" no es realmente una tienda, ya que devuelve el valor anterior (por lo que está muy cerca de CAS). – claf
Es realmente un "intercambio": almacena un nuevo valor y devuelve el valor anterior si lo desea. –
He encontrado que esta implementación de carga tiene un problema: no se puede usar en la memoria de solo lectura. – Mabus