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.
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