Senior
Ποια προβλήματα ανταγωνιστικής πρόσβασης προκύπτουν κατά την κλήση των μεθόδων Get και Set από διαφορετικές goroutines; Πώς τα λύνετε;
sobes.tech AI
Απάντηση από AI
Όταν καλούνται ταυτόχρονα οι μέθοδοι Get και Set από διαφορετικές goroutines, προκύπτει ένα πρόβλημα αγώνα δεδομένων (data race). Αυτό συμβαίνει επειδή πολλές goroutines μπορούν ταυτόχρονα να διαβάζουν και να τροποποιούν κοινά δεδομένα, οδηγώντας σε απρόβλεπτη συμπεριφορά και σφάλματα.
Για την επίλυση αυτού του προβλήματος στη Go, χρησιμοποιούνται συνήθως:
- Μυτούξ (sync.Mutex) — μπλοκάρει την πρόσβαση στα δεδομένα κατά τη διάρκεια της λειτουργίας, εξασφαλίζοντας αποκλειστική πρόσβαση.
- RWMutex (sync.RWMutex) — επιτρέπει σε πολλές goroutines να διαβάζουν δεδομένα ταυτόχρονα, αλλά μπλοκάρει την εγγραφή αν κάποιος γράφει.
- Κανάλια (channels) — για οργάνωση διαδοχικής πρόσβασης στα δεδομένα μέσω αποστολής μηνυμάτων.
Παράδειγμα με RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // κλείδωμα ανάγνωσης
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // κλείδωμα εγγραφής
defer m.mu.Unlock()
m.data[key] = value
}
Αυτή η προσέγγιση διασφαλίζει ότι τα δεδομένα δεν θα καταστραφούν κατά την ταυτόχρονη πρόσβαση.