¿Cómo arreglar la condición de carrera usando funciones atómicas en Golang?

Dos o más procesos que se ejecutan en un sistema con la ilusión de concurrencia y acceden a datos compartidos pueden intentar cambiar los datos compartidos al mismo tiempo. Esta condición en el sistema se conoce como condición de carrera. Para ver el código de muestra de Race Condition en Golang, puede consultar este artículo.
El paquete atómico en Golang proporciona los mecanismos de bloqueo de bajo nivel para sincronizar el acceso a punteros y números enteros, etc. Las funciones del paquete atómico/sincronizado se utilizan para corregir la condición de carrera.

Ejemplo:

// Golang program to fix the race
// condition using atomic package
package main
  
import (
    "fmt"
    "runtime"
    "sync"
    "sync/atomic"
)
  
// All goroutines will increment  variable c
// waitgroup is waiting for the completion
// of program.
var (
    c         int32
    waitgroup sync.WaitGroup
)
  
func main() {
  
    // with the help of Add() function add
    // one for each goroutine
    // a count of total 3
    waitgroup.Add(3)
  
    // increment with the help
    // of increment() function
    go increment("geeks")
    go increment("for")
    go increment("geeks")
  
    // waiting for completion
    // of goroutines.
    waitgroup.Wait()
  
    // print the counter
    fmt.Println("Counter:", c)
  
}
  
func increment(name string) {
  
    // Done() function used
    // to tell that it is done.
    defer waitgroup.Done()
  
    for range name {
  
        // Atomic Functions
        // for fix race condition
        atomic.AddInt32(&c, 1)
  
        // enter thread in the line by line
        runtime.Gosched()
    }
}

Producción:

Counter: 13

Aquí, puede ver que estamos usando la función atomic.AddInt32() para sincronizar la suma de los valores enteros, de modo que solo una gorutina pueda completar la operación de suma a la vez. Recuerde una cosa, siempre verifique la salida de dicho programa utilizando el compilador en línea, ya que puede obtener la misma salida cada vez (sin condición de carrera) debido a la naturaleza determinista. Así que use el compilador local como Visual Studio o CMD para ver los resultados.

Publicación traducida automáticamente

Artículo escrito por vipinyadav15799 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *