Junior — Middle
Πώς μπορεί να διασφαλιστεί ο ατομικός αποκλεισμός δύο mutex για την αποτροπή αμοιβαίων αποκλεισμών;
sobes.tech AI
Απάντηση από AI
Για την αποφυγή αμοιβαίων μπλοκαρισμάτων (deadlock) κατά το ατομικό κλείδωμα δύο mutexes, μπορούν να χρησιμοποιηθούν οι ακόλουθες προσεγγίσεις:
-
Πάντα να κλειδώνετε τα mutexes με την ίδια σειρά. Αυτή είναι η πιο απλή και συνηθισμένη μέθοδος για την αποφυγή deadlock.
-
Χρησιμοποιήστε το 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.