Εξηγήστε τι είναι μια μεταβλητή συνθήκης και πώς χρησιμοποιείται για τον συγχρονισμό νημάτων.
sobes.tech AI
Απάντηση από AI
Η μεταβλητή συνθήκης (condition variable) είναι ένας μηχανισμός συγχρονισμού νημάτων που επιτρέπει σε ένα ή περισσότερα νήματα να περιμένουν την εμφάνιση μιας συγκεκριμένης συνθήκης, ενώ ένα άλλο νήμα τα ενημερώνει για μια αλλαγή κατάστασης.
Στη Go, οι μεταβλητές συνθήκης υλοποιούνται μέσω του τύπου sync.Cond. Λειτουργεί μαζί με ένα mutex (sync.Mutex), που προστατεύει τα κοινά δεδομένα. Το νήμα που θέλει να περιμένει καλεί Wait(), απελευθερώνοντας το mutex και μπλοκάροντας μέχρι ένα άλλο νήμα να καλέσει Signal() (για να ξυπνήσει ένα νήμα) ή Broadcast() (για να ξυπνήσει όλα τα αναμένοντα).
Παράδειγμα χρήσης:
var mu sync.Mutex
cond := sync.NewCond(&mu)
sharedDataReady := false
// Νήμα που περιμένει
mu.Lock()
for !sharedDataReady {
cond.Wait() // απελευθερώνει το mu και περιμένει σήμα
}
// Εδώ sharedDataReady == true
mu.Unlock()
// Νήμα που αλλάζει την κατάσταση
mu.Lock()
sharedDataReady = true
cond.Signal() // ή cond.Broadcast(), για να ξυπνήσει τα αναμένοντα
mu.Unlock()
Έτσι, η μεταβλητή συνθήκης βοηθά στην οργάνωση σωστής αναμονής και ειδοποίησης μεταξύ νημάτων, αποφεύγοντας ενεργό polling και συνθήκες αγώνα.