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.