Sobes.tech
Junior — Middle

Σε ποιες περιπτώσεις είναι σκόπιμο να χρησιμοποιείται ο μηχανισμός Semaphore για τον συγχρονισμό νημάτων;

sobes.tech AI

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

Ο μηχανισμός Semaphore (σηματοδότης) χρησιμοποιείται για τον περιορισμό του αριθμού των νημάτων που έχουν πρόσβαση ταυτόχρονα σε έναν συγκεκριμένο πόρο ή τμήμα κρίσιμης περιοχής.

Είναι σκόπιμο να χρησιμοποιείται ένας σηματοδότης όταν:

  • Πρέπει να περιοριστεί ο αριθμός των ταυτόχρονων λειτουργιών, π.χ., πρόσβαση σε μια ομάδα συνδέσεων ή σε έναν περιορισμένο αριθμό αρχείων.
  • Πρέπει να ελεγχθεί ο παραλληλισμός για να αποφευχθεί η υπερφόρτωση του συστήματος.
  • Απαιτείται συγχρονισμός νημάτων, όταν πολλά νήματα πρέπει να περιμένουν την απελευθέρωση ενός πόρου.

Στο iOS, οι σηματοδότες χρησιμοποιούνται συχνά για τη διαχείριση ασύγχρονων εργασιών, π.χ., για να περιμένουν την ολοκλήρωση πολλών λειτουργιών ή να περιορίσουν τον αριθμό των ταυτόχρονα εκτελούμενων εργασιών.

Παράδειγμα χρήσης του DispatchSemaphore σε Swift:

let semaphore = DispatchSemaphore(value: 3) // μέγιστο 3 νήματα ταυτόχρονα

func accessResource() {
    semaphore.wait() // μειώνει τον μετρητή, αν είναι 0, το νήμα μπλοκάρεται
    // Εργασία με τον πόρο
    print("Το νήμα έχει πρόσβαση")
    sleep(1) // προσομοίωση εργασίας
    semaphore.signal() // αυξάνει τον μετρητή, ελευθερώνοντας χώρο
}

for _ in 1...10 {
    DispatchQueue.global().async {
        accessResource()
    }
}

Σε αυτό το παράδειγμα, όχι περισσότερο από 3 νήματα μπορούν να εργάζονται ταυτόχρονα με τον πόρο.