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