Junior — Middle
Já teve experiência com deadlock ao trabalhar com multithreading?
sobes.tech IA
Resposta da IA
Sim, já tive experiência com deadlock em programas multithread. Um deadlock ocorre quando dois ou mais threads esperam indefinidamente pela liberação de recursos que estão sendo utilizados por outros, levando à paralisação.
Por exemplo, se o thread A adquiriu o recurso 1 e espera pelo recurso 2, e o thread B adquiriu o recurso 2 e espera pelo recurso 1, ocorre um deadlock.
Em Go, isso pode acontecer ao usar mutexes ou canais sem sincronização adequada. Para evitar deadlocks, é importante:
- Sempre adquirir os recursos na mesma ordem.
- Usar timeouts ou contextos com cancelamento.
- Minimizar o tempo de retenção de bloqueios.
Exemplo de um potencial deadlock com mutexes:
var mu1, mu2 sync.Mutex
func f1() {
mu1.Lock()
defer mu1.Unlock()
time.Sleep(time.Second)
mu2.Lock()
defer mu2.Unlock()
// trabalho
}
func f2() {
mu2.Lock()
defer mu2.Unlock()
time.Sleep(time.Second)
mu1.Lock()
defer mu1.Unlock()
// trabalho
}
Aqui, f1 e f2 podem bloquear-se mutuamente se chamados simultaneamente.