Senior
Ποια primitives συγχρονισμού υπάρχουν στο Go; Πώς διαφέρει το RWMutex από ένα απλό Mutex;
sobes.tech AI
Απάντηση από AI
Στα Go, χρησιμοποιούνται primitives συγχρονισμού από το πακέτο sync, τα κύρια από αυτά είναι:
- Mutex — ένας απλός mutex για αμοιβαία αποκλεισμό, μπλοκάρει την πρόσβαση σε πόρο για όλες τις άλλες goroutines μέχρι να ξεμπλοκάρει.
- RWMutex — ένας mutex με διαχωρισμό ανάγνωσης και εγγραφής. Επιτρέπει σε πολλαπλές goroutines να διαβάζουν δεδομένα ταυτόχρονα (RLock), αλλά η εγγραφή (Lock) είναι αποκλειστική και μπλοκάρει όλους.
- WaitGroup — για να περιμένει την ολοκλήρωση μιας ομάδας goroutines.
- Cond — μια μεταβλητή συνθήκης για σήμα μεταξύ goroutines.
Διαφορά μεταξύ RWMutex και Mutex:
- Το Mutex μπλοκάρει πλήρως την πρόσβαση, επιτρέποντας μόνο έναν ιδιοκτήτη.
- Το RWMutex επιτρέπει σε πολλούς αναγνώστες να διατηρούν το κλείδωμα ταυτόχρονα αν δεν υπάρχουν συγγραφείς.
- Η εγγραφή με RWMutex είναι αποκλειστική και μπλοκάρει όλους τους άλλους.
Παράδειγμα:
var mu sync.RWMutex
var data int
func readData() int {
mu.RLock() // κλείδωμα για ανάγνωση
defer mu.RUnlock()
return data
}
func writeData(val int) {
mu.Lock() // αποκλειστικό κλείδωμα για εγγραφή
defer mu.Unlock()
data = val
}
Η χρήση του RWMutex βελτιώνει την απόδοση σε σενάρια με συχνές αναγνώσεις και σπάνιες εγγραφές.