Sobes.tech
Junior — Middle

Quais são as formas de evitar deadlocks em aplicações multithread?

sobes.tech IA

Resposta da IA

Os bloqueios mútuos (deadlocks) ocorrem quando dois ou mais threads esperam uns pelos outros, mantendo recursos, e nenhum consegue continuar. Para evitá-los, podem-se usar as seguintes abordagens:

  • Evitar bloqueios aninhados: minimizar a quantidade de mutexes adquiridos simultaneamente.
  • Ordenar a aquisição de recursos: sempre adquirir os mutexes na mesma ordem em todos os threads.
  • Usar timeouts na aquisição de bloqueios: se um recurso não estiver disponível, o thread libera os já adquiridos e tenta novamente.
  • Aplicar algoritmos de detecção e recuperação: verificar periodicamente a presença de deadlocks e agir de acordo.
  • Usar primitivas de sincronização de nível superior: por exemplo, estruturas de dados sem bloqueio ou operações atômicas.

Exemplo de ordenação de recursos:

std::mutex mtx1, mtx2;

void thread_func() {
    std::lock(mtx1, mtx2); // Adquire ambos os mutexes simultaneamente
    std::lock_guard<std::mutex> lock1(mtx1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(mtx2, std::adopt_lock);
    // Trabalhar com recursos
}

O uso de std::lock ajuda a evitar deadlocks ao adquirir múltiplos mutexes.