Sobes.tech
Middle

Τι είναι ένας σημαφόρος στο πλαίσιο του προγραμματισμού;

sobes.tech AI

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

Ο σημαφόρος είναι μια primitive συγχρονισμού νημάτων που ελέγχει την πρόσβαση σε έναν περιορισμένο πόρο. Διατηρεί έναν ακέραιο μετρητή.

Βασικές λειτουργίες:

  • wait()P / acquire) : Μειώνει τον μετρητή κατά 1. Αν ο μετρητής γίνει αρνητικός, το νήμα μπλοκάρεται μέχρι να εκτελέσει άλλο signal().
  • signal()V / release) : Αυξάνει τον μετρητή κατά 1. Αν υπάρχουν μπλοκαρισμένα νήματα, ένα από αυτά ξεμπλοκάρεται.

Τύποι σημαφόρων:

  • Διπλός σημαφόρος (mutex) : Ο μετρητής παίρνει τις τιμές 0 ή 1. Χρησιμοποιείται για την εξασφάλιση αμοιβαίας αποκλειστικότητας – μόνο ένα νήμα μπορεί να έχει πρόσβαση στον πόρο ταυτόχρονα.
  • Μετρητικός σημαφόρος : Ο μετρητής μπορεί να πάρει τιμές από 0 έως N. Χρησιμοποιείται για τη διαχείριση πρόσβασης σε μια ομάδα πόρων με περιορισμένο αριθμό διαθέσιμων στοιχείων.

Παράδειγμα χρήσης σε Swift για τον περιορισμό του αριθμού των ταυτόχρονων εργασιών:

// Δημιουργία σημαφόρου που επιτρέπει έως και 3 ταυτόχρονες προσβάσεις
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Εργασία 1
    semaphore.wait() // Μειώνει τον μετρητή, μπλοκάρει αν > 3 εργασίες τρέχουν
    print("Εργασία 1 ξεκίνησε")
    Thread.sleep(forTimeInterval: 2) // Προσομοίωση εργασίας
    print("Εργασία 1 ολοκληρώθηκε")
    semaphore.signal() // Αυξάνει τον μετρητή, ξεμπλοκάρει τις αναμονές
}

DispatchQueue.global().async {
    // Εργασία 2
    semaphore.wait()
    print("Εργασία 2 ξεκίνησε")
    Thread.sleep(forTimeInterval: 3)
    print("Εργασία 2 ολοκληρώθηκε")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Εργασία 3
    semaphore.wait()
    print("Εργασία 3 ξεκίνησε")
    Thread.sleep(forTimeInterval: 1)
    print("Εργασία 3 ολοκληρώθηκε")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Εργασία 4 (θα περιμένει μέχρι να ελευθερωθεί μια θέση)
    semaphore.wait()
    print("Εργασία 4 ξεκίνησε")
    Thread.sleep(forTimeInterval: 2)
    print("Εργασία 4 ολοκληρώθηκε")
    semaphore.signal()
}

// Περιμένουμε να ολοκληρωθούν όλες οι εργασίες
// Χρησιμοποιήστε πιο αξιόπιστους μηχανισμούς αναμονής σε πραγματικό κώδικα
Thread.sleep(forTimeInterval: 5)