Sobes.tech
Junior — Middle

¿Ha tenido experiencia con bloqueos mutuos (Deadlock) al trabajar con multithreading?

sobes.tech AI

Respuesta de la IA

Sí, he tenido experiencia con bloqueos mutuos (deadlock) en programas multihilo. Un deadlock ocurre cuando dos o más hilos esperan indefinidamente liberar recursos que están siendo utilizados por otros, lo que lleva a una detención.

Por ejemplo, si el hilo A ha adquirido el recurso 1 y espera el recurso 2, y el hilo B ha adquirido el recurso 2 y espera el recurso 1, se produce un deadlock.

En Go, esto puede suceder al usar mutexes o canales sin una sincronización adecuada. Para evitar deadlocks, es importante:

  • Siempre adquirir los recursos en el mismo orden.
  • Usar timeouts o contextos con cancelación.
  • Minimizar el tiempo que se mantienen las bloqueos.

Ejemplo de un posible deadlock con mutexes:

var mu1, mu2 sync.Mutex

func f1() {
    mu1.Lock()
    defer mu1.Unlock()
    time.Sleep(time.Second)
    mu2.Lock()
    defer mu2.Unlock()
    // trabajo
}

func f2() {
    mu2.Lock()
    defer mu2.Unlock()
    time.Sleep(time.Second)
    mu1.Lock()
    defer mu1.Unlock()
    // trabajo
}

Aquí, f1 y f2 pueden bloquearse mutuamente si se llaman simultáneamente.