Sobes.tech
Junior — Middle

Πώς μπορεί να διασφαλιστεί ο ατομικός αποκλεισμός δύο mutex για την αποτροπή αμοιβαίων αποκλεισμών;

sobes.tech AI

Απάντηση από AI

Για την αποφυγή αμοιβαίων μπλοκαρισμάτων (deadlock) κατά το ατομικό κλείδωμα δύο mutexes, μπορούν να χρησιμοποιηθούν οι ακόλουθες προσεγγίσεις:

  1. Πάντα να κλειδώνετε τα mutexes με την ίδια σειρά. Αυτή είναι η πιο απλή και συνηθισμένη μέθοδος για την αποφυγή deadlock.

  2. Χρησιμοποιήστε το std::lock (C++11 και άνω). Αυτή η λειτουργία κλειδώνει πολλαπλά mutexes ταυτόχρονα, διασφαλίζοντας την απουσία deadlock.

Παράδειγμα με std::lock:

#include <mutex>

std::mutex m1, m2;

void func() {
    std::lock(m1, m2); // κλειδώνει και τα δύο mutexes ατομικά
    std::lock_guard<std::mutex> lock1(m1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(m2, std::adopt_lock);
    // κρίσιμη ενότητα
}

Εδώ, το std::lock κλειδώνει και τα δύο mutexes, και το std::lock_guard με τη σημαία std::adopt_lock αναλαμβάνει τον έλεγχο των ήδη κλειδωμένων mutexes.