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:
-
Sempre bloquear os mutexes na mesma ordem. Esta é a forma mais simples e comum de evitar deadlocks.
-
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.