Sobes.tech
Middle+

Μπορείτε να δώσετε ένα παράδειγμα κατάστασης όπου συμβαίνει αμοιβαία αποκλεισμός διαδικασιών που τις αναγκάζει να κολλήσουν για πάντα;

sobes.tech AI

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

Το αδιέξοδο (deadlock) συμβαίνει όταν δύο ή περισσότεροι διαδικασίες (ή νήματα) κατέχουν ταυτόχρονα πόρους και ο καθένας περιμένει να ελευθερώσει ο άλλος πόρο. Ως αποτέλεσμα, κανένας δεν μπορεί να συνεχίσει.

Παράδειγμα:

  • Η διαδικασία A αποκτά τον πόρο R1.
  • Η διαδικασία B αποκτά τον πόρο R2.
  • Η διαδικασία A προσπαθεί να αποκτήσει τον πόρο R2 και μπλοκάρεται, περιμένοντας να ελευθερωθεί.
  • Η διαδικασία B προσπαθεί να αποκτήσει τον πόρο R1 και επίσης μπλοκάρεται.

Οι δύο διαδικασίες περιμένουν η μία την άλλη, οδηγώντας σε ατέρμονο αδιέξοδο.

Παράδειγμα σε C++ με mutex:

#include <mutex>
#include <thread>
#include <iostream>

std::mutex mtx1, mtx2;

void thread1() {
    std::lock_guard<std::mutex> lock1(mtx1);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::lock_guard<std::mutex> lock2(mtx2);
    std::cout << "Το νήμα 1 απέκτησε και τα δύο κλειδώματα\n";
}

void thread2() {
    std::lock_guard<std::mutex> lock2(mtx2);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::lock_guard<std::mutex> lock1(mtx1);
    std::cout << "Το νήμα 2 απέκτησε και τα δύο κλειδώματα\n";
}

int main() {
    std::thread t1(thread1);
    std::thread t2(thread2);
    t1.join();
    t2.join();
    return 0;
}

Σε αυτό το παράδειγμα, μπορεί να προκύψει deadlock αν το νήμα1 αποκτήσει το mtx1 και το νήμα2 το mtx2, και αμφότερα περιμένουν το άλλο να ελευθερώσει τον πόρο.