Me encuentro con una situación en la que necesito la suma atómica de dos valores en la memoria. El código que he heredado es la siguiente:¿Hay alguna forma en que pueda hacer dos lecturas atómicas?
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
El individuo lee de a y b son atómica, y todas las escrituras en otras partes del código para estas dos posiciones de memoria son también lockless atómica. Sin embargo, el problema es que los valores de las dos ubicaciones pueden cambiar y cambian entre las dos lecturas.
Entonces, ¿cómo hago esta operación atómica? Lo sé todo sobre CAS, pero suele implicar que las operaciones de lectura-modificación-escritura sean atómicas y eso no es exactamente lo que quiero hacer aquí.
¿Hay alguna manera de hacerlo, o es la mejor opción para refactorizar el código para que solo tenga que marcar un valor?
Editar: Gracias, no mencioné que quería hacer esto sin bloqueos en la primera revisión, pero algunas personas lo detectaron después de mi segunda revisión. Sé que nadie cree en las personas cuando dicen cosas como esta, pero no puedo usar cerraduras prácticamente. Tendría que emular un mutex con átomos y eso sería más trabajo que refacturar el código para hacer un seguimiento de un valor en lugar de dos.
Por ahora mi método de investigación implica aprovechar el hecho de que los valores son consecutivos y tomarlos atómicamente con una lectura de 64 bits, que estoy seguro son atómicos en mis plataformas de destino. Si alguien tiene nuevas ideas, ¡por favor contribuya! Gracias.
Ocurren que ser consecutivos 32 direcciones de bits y los procesadores que necesito para codificar para trabajar en tener atómica de 64 bits lee si alineado correctamente, por lo esto parece el camino a seguir. –
Ah, en ese caso puede escribir algún ensamblaje o simplemente verificar la salida de ensamblaje de su compilador para verificar que el uso de un tipo de 64 bits haga lo correcto. En ese caso, puede ir sin candado. – Eddie