Sobes.tech
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:

  1. Blocați întotdeauna mutex-urile în aceeași ordine. Aceasta este cea mai simplă și comună metodă de a evita deadlock-urile.

  2. 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.