"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué mi rutina incrementa una variable produce resultados inesperados?

¿Por qué mi rutina incrementa una variable produce resultados inesperados?

Publicado el 2024-11-05
Navegar:914

Why Does My Goroutine Incrementing a Variable Produce Unexpected Results?

¿Es esto un resultado de la optimización del compilador?

En este fragmento de código, se inicia una gorutina que incrementa repetidamente la variable i:

package main

import "time"

func main() {
    i := 1
    go func() {
        for {
            i  
        }
    }()
    

Sin embargo, el resultado siempre es 1. Este comportamiento se puede atribuir al modelo de memoria Go y a la implementación específica de este código.

El modelo de memoria Go

El El modelo de memoria Go define las condiciones bajo las cuales se puede garantizar que las lecturas de una variable en una rutina observen los valores producidos por las escrituras en la misma variable en una rutina diferente. Enfatiza la importancia de la sincronización para el acceso simultáneo a datos compartidos.

Omitir sincronización

En el código proporcionado:

  • La asignación a i (es decir, i) no va seguido de ningún evento de sincronización, lo que indica que es posible que los cambios no sean visibles inmediatamente para otras rutinas.
  • El compilador puede optimizar esta optimización de bucle simplificándola a no operativa.

Optimización por parte del compilador

Un compilador agresivo podría eliminar la declaración i, reduciendo efectivamente la rutina a:

for {}

Ejemplo con sincronización

Para demostrar que el problema se debe a la falta de sincronización, considere el siguiente código:

package main

import (
    "sync"
    "time"
)

func main() {
    mx := new(sync.Mutex)
    i := 1
    go func() {
        for {
            mx.Lock()
            i  
            mx.Unlock()
        }
    }()
    

En este caso, la salida ya no es 1, sino un número grande, como se esperaba. sync.Mutex proporciona sincronización y garantiza que ambas gorutinas accedan a i de manera controlada, lo que permite que la gorutina incremente i y haga que los cambios sean visibles para la rutina principal.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3