Sobes.tech
Junior — Middle

Como garantir o bloqueio atômico de dois mutexes para evitar deadlocks?

sobes.tech IA

Resposta da IA

Para evitar deadlocks ao bloquear dois mutexes de forma atómica, pode usar as seguintes abordagens:

  1. Sempre bloquear os mutexes na mesma ordem. Esta é a forma mais simples e comum de evitar deadlocks.

  2. Usar std::lock (C++11 e superior). Esta função bloqueia vários mutexes ao mesmo tempo, garantindo a ausência de deadlock.

Exemplo com std::lock:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // bloqueia ambos os mutexes de forma atómica
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // secção crítica
}

Aqui, std::lock bloqueia ambos os mutexes, e std::lock_guard com a bandeira std::adopt_lock assume o controlo dos mutexes já bloqueados.