es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    var num int64
    
    func add(max int64) int64 {
      for {
        old := atomic.LoadInt64(&num)
        if old >= max {
          return old
        }
    
        newNum := old + 1
        if atomic.CompareAndSwapInt64(&num, old, newNum) {
          return newNum
        }
      }
    }
    

    En el código anterior, la variable num se declara como int64 para que coincida con el tipo del parámetro max. El bucle for continúa hasta que el valor de old sea mayor o igual que el valor de max. Si el valor de old es mayor o igual a max, se devuelve el valor de old.

    Si el valor de old es menor que max, se incrementa la variable newNum en 1. La función atomic.CompareAndSwapInt64 compara el valor actual de num con el valor old. Si son iguales, la función asigna el valor de newNum a num 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.

Comments are closed.