Sobes.tech
Junior — Middle

Μπορείτε να εξηγήσετε την αρχή λειτουργίας του σημαφόρου στον πολυνηματικό προγραμματισμό;

sobes.tech AI

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

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

Αρχή λειτουργίας:

  • Αρχικά, ο μετρητής του σημαφόρου τίθεται σε έναν αριθμό ίσο με τον αριθμό των διαθέσιμων πόρων.
  • Όταν ένα νήμα θέλει να αποκτήσει πρόσβαση, καλεί τη λειτουργία "wait" (ή "acquire"), η οποία μειώνει τον μετρητή κατά 1.
  • Αν ο μετρητής γίνει μικρότερος από το μηδέν, το νήμα μπλοκάρεται και περιμένει μέχρι ένα άλλο νήμα να ελευθερώσει τον πόρο.
  • Όταν ένα νήμα ελευθερώνει τον πόρο, καλεί τη λειτουργία "signal" (ή "release"), η οποία αυξάνει τον μετρητή κατά 1 και ξεμπλοκάρει τα αναμονή νήματα.

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

let semaphore = DispatchSemaphore(value: 2) // επιτρέπουμε ταυτόχρονα 2 νήματα

DispatchQueue.global().async {
    semaphore.wait() // προσπαθούμε να αποκτήσουμε πρόσβαση
    print("Το νήμα ξεκίνησε να δουλεύει")
    sleep(2) // προσομοίωση εργασίας
    print("Το νήμα τελείωσε την εργασία")
    semaphore.signal() // ελευθερώνουμε τον πόρο
}

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