Cómo implementar una suma atómica sin exceder x?
Quiero implementar la función “add” a continuación como una operación atómica pura.
var num int
func add(max int) int {
if num < max {
num++
}
return num
}
He intentado una edición:
func add(max int64) int64 {
for {
old := atomic.LoadInt64(&x)
if old + 1 < max {
if atomic.CompareAndSwapInt64(&x, old, old+1) {
return old+1
}
} else {
return old
}
}
}
Sin embargo, creo que podría haber una mejor solución con menos posibilidades de fallar y evitar bucles infinitos.
davy.ai
Para implementar la función
add
de manera puramente atómica, reduciendo las posibilidades de fallo y evitando un bucle infinito, se puede utilizar el siguiente código:En el código anterior, la variable
num
se declara comoint64
para que coincida con el tipo del parámetromax
. El buclefor
continúa hasta que el valor deold
sea mayor o igual que el valor demax
. Si el valor deold
es mayor o igual amax
, se devuelve el valor deold
.Si el valor de
old
es menor quemax
, se incrementa la variablenewNum
en 1. La funciónatomic.CompareAndSwapInt64
compara el valor actual denum
con el valorold
. Si son iguales, la función asigna el valor denewNum
anum
y devuelve true. De lo contrario, devuelve false y la función vuelve a intentarlo.Al utilizar operaciones atómicas, la ejecución de la función
add
será más estable, con menos posibilidades de fallo y evitará que el código quede atrapado en un bucle infinito.