Evitar Condiciones de Carrera en Go con Mutex y WaitGroup
Clase 3 de 19 • Curso de Go Avanzado: Concurrencia y Patrones de Diseño
Contenido del curso
Concurrencia
- 2

Condiciones de Carrera en Programación Concurrente con Go
04:52 min - 3

Evitar Condiciones de Carrera en Go con Mutex y WaitGroup
Viendo ahora - 4

Lectura y Escritura Concurrente en Go con RWMutex
06:15 min - 5

Creación de un Sistema de Caché Concurrente en Go
14:29 min - 6

Manejo de Condiciones de Carrera en Go: Implementación de Mutex
08:52 min - 7

Cache concurrente en Go para cálculos intensivos de Fibonacci
16:31 min
Patrones de diseño
- 8

Patrones de Diseño en Programación Orientada a Objetos con Go
04:53 min - 9

Patrón de Diseño Factory en Go: Creación y Uso Práctico
15:17 min - 10

Implementación de Singleton en Go para Conexiones de Base de Datos
08:48 min - 11

Patrón de Diseño Adapter en Go: Implementación Práctica
09:51 min - 12

Patrón de Diseño Observer en Go: Implementación Práctica
11:59 min - 13

Implementación del Patrón de Diseño Strategy en Go
08:53 min
Net
- 14

Escaneo de Puertos TCP con Go: Introducción Básica
07:45 min - 15

Concurrencia en Go: Escáner de Puertos Eficiente y Personalizable
09:16 min - 16

Implementación de NetCAD como Cliente TCP en Go
10:14 min - 17

Construcción de Back End para Servidor de Chat en Go
16:08 min - 18

Implementación de un Servidor de Chat en Go con TCP
13:54 min
Conclusión
¿Cómo podemos manejar la condición de carrera en Go?
La programación concurrente en Go nos permite realizar múltiples tareas a la vez, incrementando la eficiencia de nuestros programas. Sin embargo, esto también puede llevar a problemas si no se manejan adecuadamente los accesos compartidos a las variables. Uno de estos problemas es la condición de carrera, un fenómeno donde múltiples rutinas acceden y manipulan datos compartidos al mismo tiempo, causando comportamientos incorrectos o inconsistentes.
¿Cómo podemos identificar una condición de carrera?
Para empezar, Go ofrece una herramienta para detectar condiciones de carrera. Podemos utilizar la bandera --race al compilar nuestro programa. Esta simple acción nos dará un aviso si el compilador detecta subrutinas accediendo indeciblemente a variables compartidas. La detección temprana es crucial para evitar problemas en producción.
go run --race main.go
¿Cómo podemos evitar una condición de carrera en Go?
Manejando adecuadamente las condiciones de carrera, podemos asegurar la integridad de los datos. Un enfoque común es utilizar locks o candados. En Go, podemos utilizar la estructura sync.Mutex que actúa como un candado que regula el acceso a las variables compartidas.
Implementación básica de locks en Go
- Definir un Mutex: Primero, definimos un
sync.Mutexen nuestro programa, que usaremos para controlar el acceso.
var mu sync.Mutex
- Bloquear y desbloquear el acceso: Dentro de las funciones que modifican los datos compartidos, utilizamos los métodos
LockyUnlockde Mutex para bloquear y desbloquear el acceso a las variables.
func depositar(amount int) {
mu.Lock()
b := balance
balance = b + amount
mu.Unlock()
}
Este código garantiza que solo una go rutina pueda modificar el balance a la vez, evitando por ende la condición de carrera.
¿Qué ocurre si solo realizamos lecturas?
Aunque el uso de sync.Mutex soluciona los problemas de concurrencia en operaciones de escritura, puede resultar ineficiente para operaciones que solo requieren lectura. En estos casos, donde no estamos modificando los datos, hay otro tipo de lock en Go más apropiado llamado sync.RWMutex. Este permite múltiples lecturas concurrentes pero restringe el acceso total al realizar una escritura. Lo exploraremos más en profundidad en las siguientes lecciones.