Junior — Middle
Cum se poate asigura blocarea atomică a două mutex-uri pentru a preveni blocajele mutuale?
sobes.tech AI
Răspuns de la AI
Pentru a preveni blocarea reciprocă (deadlock) în timpul blocării atomice a două mutex-uri, se pot folosi următoarele abordări:
-
Blocați întotdeauna mutex-urile în aceeași ordine. Aceasta este cea mai simplă și comună metodă de a evita deadlock-urile.
-
Utilizați std::lock (C++11 și versiuni ulterioare). Această funcție blochează mai multe mutex-uri simultan, garantând absența deadlock-ului.
Exemplu cu std::lock:
#include <mutex>
std::mutex m1, m2;
void func() {
std::lock(m1, m2); // blochează ambele mutex-uri atomice
std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
// secțiune critică
}
Aici, std::lock blochează ambele mutex-uri, iar std::lock_guard cu steagul std::adopt_lock preia controlul asupra mutex-urilor deja blocate.