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)