Junior
O que é um deadlock?
sobes.tech IA
Resposta da IA
Deadlock (Deadlock) é um estado em que dois ou mais threads ou processos ficam bloqueados, esperando uns pelos outros para continuar a execução. Acontece quando cada thread possui um recurso que precisa de outro thread, e espera que esse recurso seja liberado.
Quatro condições necessárias para que ocorra um deadlock (condições de Coffman):
- Exclusão mútua (Mutual Exclusion): O recurso não pode ser utilizado simultaneamente por vários processos.
- Retenção e espera (Hold and Wait): Um thread que já possui pelo menos um recurso espera adquirir recursos adicionais que estão sendo utilizados por outros threads.
- Sem preempção (No Preemption): Os recursos não podem ser forçados a serem retirados de um thread. Eles só podem ser liberados voluntariamente pelo thread que os possui.
- Espera circular (Circular Wait): Existe um ciclo de espera entre dois ou mais threads. Por exemplo, o Thread A espera por um recurso que está sendo mantido pelo Thread B, que por sua vez espera por um recurso que está sendo mantido pelo Thread C, que espera por um recurso que está sendo mantido pelo Thread A.
No desenvolvimento de iOS, deadlocks frequentemente ocorrem ao trabalhar com concorrência, por exemplo, ao usar incorretamente GCD (Grand Central Dispatch) ou filas de operações:
- Tentar executar de forma síncrona um bloco de código em uma fila onde já se encontra o thread atual (por exemplo, chamar
syncna filamaina partir do thread principal). - Dois threads tentam adquirir dois locks ou semáforos em ordens diferentes.
Exemplo simples de deadlock usando GCD:
func deadlockExample() {
// Fila principal
let mainQueue = DispatchQueue.main
// Executar de forma síncrona um bloco na fila principal a partir do thread principal
// O thread principal espera a conclusão do bloco,
// e o bloco não pode ser executado porque o thread principal está ocupado esperando.
mainQueue.sync {
print("Esta linha nunca será alcançada.")
}
}