Sobes.tech
Junior — Middle

Já enfrentou problemas de deadlock ao desenvolver sistemas multithread?

sobes.tech IA

Resposta da IA

Sim, ao desenvolver sistemas multithread, encontrei o problema de deadlock. É uma situação em que dois ou mais threads bloqueiam-se mutuamente, esperando liberar recursos que estão ocupados pelo outro.

Para evitar deadlocks, aplico as seguintes práticas:

  • Sempre adquirir múltiplos bloqueios na mesma ordem.
  • Minimizar o tempo de retenção dos bloqueios.
  • Usar tempos limite ao tentar adquirir bloqueios.
  • Utilizar primitivas de sincronização de nível superior, como canais em Go.

Exemplo de um deadlock simples em Go:

var mu1, mu2 sync.Mutex

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

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

Aqui, f1 e f2 podem bloquear-se mutuamente se ambos adquirirem o primeiro mutex e aguardarem o segundo. Para evitar isso, é necessário coordenar a ordem de aquisição dos mutexes.