Sobes.tech
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 βελτιώνει την απόδοση σε σενάρια με συχνές αναγνώσεις και σπάνιες εγγραφές.