Sobes.tech
Middle

Ποια είναι η βάση των φραγμών και των σημάτων;

sobes.tech AI

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

Οι φράχτες και οι σημαφόροι στο πλαίσιο του παραλληλισμού προγραμματισμού βασίζονται σε μηχανισμούς συγχρονισμού:

  • Σημαφόροι: Βασίζονται σε ατομικές λειτουργίες πάνω σε έναν μετρητή. Κύριες λειτουργίες:

    • waitP, απόκτηση): Μειώνει τον μετρητή. Αν ο μετρητής γίνει αρνητικός, το νήμα μπλοκάρεται μέχρι να εκτελέσει ένα άλλο νήμα signal.
    • signalV, απελευθέρωση): Αυξάνει τον μετρητή. Αν υπάρχουν μπλοκαρισμένα νήματα, ένα από αυτά ξυπνά.
    • Οι σημαφόροι μπορούν να είναι δυαδικοί (τιμές 0 ή 1, λειτουργούν ως mutexes) ή μετρητικοί (επιτρέπουν σε περιορισμένο αριθμό νημάτων να έχουν πρόσβαση σε πόρο).
  • Φράγματα (Barriers): Βασίζονται σε μηχανισμό αναμονής από όλους τους συμμετέχοντες. Ένα νήμα που φτάνει στο φράγμα μπλοκάρεται μέχρι να φτάσουν και τα άλλα νήματα που εμπλέκονται στη συγχρονισμό. Μόλις όλοι φτάσουν στο φράγμα, συνεχίζουν ταυτόχρονα.

Στην ανάπτυξη iOS/macOS, αυτοί οι όροι υλοποιούνται με τη χρήση frameworks για παράλληλο προγραμματισμό, όπως το GCD (Grand Central Dispatch) και το OperationQueue.

Για παράδειγμα, στο GCD:

// Παράδειγμα χρήσης DispatchSemaphore
let semaphore = DispatchSemaphore(value: 1) // Δυαδικός σημαφόρος

// Wait (απόκτηση)
semaphore.wait()
// Πρόσβαση στην κρίσιμη ενότητα
semaphore.signal() // Σήμα (απελευθέρωση)

Οι φράχτες στο GCD υλοποιούνται με τη χρήση εργασιών φραγμού (barrier tasks) για τα παράλληλα ουρές:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// Συνήθεις εργασίες
concurrentQueue.async {
    // ...
}

// Εργασία φραγμού - εκτελείται μόνο όταν όλες οι προηγούμενες εργασίες ολοκληρωθούν
// Και μετά από αυτό, καμία νέα εργασία δεν θα ξεκινήσει μέχρι να ολοκληρωθεί
concurrentQueue.async(flags: .barrier) {
    // ...
}

// Συνήθεις εργασίες που θα ξεκινήσουν μετά την ολοκλήρωση της εργασίας φραγμού
concurrentQueue.async {
    // ...
}