Junior — Middle
¿En qué situaciones puede ocurrir un bloqueo mutuo de hilos o procesos?
sobes.tech AI
Respuesta de la IA
La interbloqueo (deadlock) ocurre cuando dos o más hilos o procesos esperan liberar recursos que están siendo utilizados por otros, y ninguno puede continuar. Las principales situaciones que conducen a un interbloqueo:
- Los hilos adquieren varios recursos en un orden diferente. Por ejemplo, el hilo A ha adquirido el recurso 1 y espera el recurso 2, mientras que el hilo B ha adquirido el recurso 2 y espera el recurso 1.
- Uso de bloqueos (mutex) sin un orden estricto de adquisición.
- Espera cíclica de recursos.
En Go, esto puede ocurrir por un uso incorrecto de mutexes, canales u otros primitivas de sincronización. Por ejemplo, si dos goroutines esperan una a la otra a través de canales sin timeouts o buffers.
Para evitar interbloqueos, se debe:
- Adquirir recursos en el mismo orden.
- Usar timeouts o intentos de adquisición con devolución de error.
- Minimizar el tiempo de retención de bloqueos.
Ejemplo simple de interbloqueo con mutexes en Go:
var mu1, mu2 sync.Mutex
func goroutine1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Millisecond * 100)
mu2.Lock()
defer mu2.Unlock()
// trabajo
}
func goroutine2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Millisecond * 100)
mu1.Lock()
defer mu1.Unlock()
// trabajo
}
Aquí, goroutine1 y goroutine2 pueden bloquearse mutuamente si la primera ha adquirido mu1 y la segunda mu2, y ambas esperan que se libere el otro mutex.