Sobes.tech
Junior — Middle

Ποια είναι η διαφορά μεταξύ της χρήσης ενός τυπικού mutex και ενός mutex με δυνατότητα ανάγνωσης και εγγραφής (RWMutex);

sobes.tech AI

Απάντηση από AI

Το τυπικό mutex (sync.Mutex) στο Go παρέχει αποκλειστική πρόσβαση σε πόρο: κάθε στιγμή μόνο μια goroutine μπορεί να αποκτήσει το mutex, οι υπόλοιπες περιμένουν.

Το mutex με δυνατότητα ανάγνωσης και εγγραφής (sync.RWMutex) επιτρέπει:

  • Πολλές goroutines μπορούν ταυτόχρονα να αποκτήσουν το mutex για ανάγνωση (RLock), αν δεν υπάρχει συγγραφέας.
  • Μόνο μια goroutine μπορεί να αποκτήσει το mutex για εγγραφή (Lock), μπλοκάροντας όλους τους αναγνώστες και άλλους συγγραφείς.

Αυτό αυξάνει την απόδοση σε σενάρια όπου οι λειτουργίες ανάγνωσης είναι πολύ πιο συχνές από τις εγγραφές, καθώς οι αναγνώσεις δεν μπλοκάρουν η μία την άλλη.

Παράδειγμα:

var mu sync.RWMutex
var data int

// Ανάγνωση
mu.RLock()
fmt.Println(data)
mu.RUnlock()

// Εγγραφή
mu.Lock()
data = 42
mu.Unlock()

Αν χρησιμοποιηθεί ένας απλός Mutex, ακόμη και οι αναγνώσεις θα μπλοκάρουν η μία την άλλη, μειώνοντας το παράλληλοτητα.