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