Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ RW Mutex και ενός κανονικού mutex;

sobes.tech AI

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

Το sync.RWMutex επιτρέπει σε πολλαπρα goroutines να διαβάζουν δεδομένα ταυτόχρονα, αλλά μόνο ένα goroutine μπορεί να γράψει δεδομένα κάθε φορά. Το sync.Mutex μπλοκάρει την πρόσβαση σε οποιοδήποτε άλλο goroutine που προσπαθεί να αποκτήσει το κλείδωμα (είτε για ανάγνωση είτε για εγγραφή), μέχρι να απελευθερώσει το πρώτο goroutine το κλείδωμα.

  • sync.Mutex: Εξατομικευμένο κλείδωμα. Είναι είτε κλειδωμένο είτε όχι. Μόνο ένα goroutine μπορεί να διατηρεί το mutex σε κάθε χρονική στιγμή. Κατάλληλο όταν οι λειτουργίες ανάγνωσης και εγγραφής πραγματοποιούνται συχνά ή έχουν παρόμοιο χρόνο εκτέλεσης.

    // Παράδειγμα χρήσης Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Κλείδωμα για ανάγνωση και εγγραφή. Επιτρέπει σε πολλαπρα goroutines να διατηρούν το κλείδωμα για ανάγνωση ταυτόχρονα, αλλά το κλείδωμα για εγγραφή είναι αποκλειστικό. Ένα goroutine που διατηρεί το κλείδωμα για εγγραφή μπλοκάρει τόσο άλλες λειτουργίες εγγραφής όσο και ανάγνωσης. Τα goroutines που διατηρούν το κλείδωμα για ανάγνωση μπλοκάρουν τις λειτουργίες εγγραφής, αλλά όχι άλλες λειτουργίες ανάγνωσης. Κατάλληλο όταν οι λειτουργίες ανάγνωσης συμβαίνουν πολύ πιο συχνά από τις λειτουργίες εγγραφής.

    // Παράδειγμα χρήσης RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Λαμβάνουμε το κλείδωμα για ανάγνωση
        value := data[key]
        rwmu.RUnlock() // Απελευθερώνουμε το κλείδωμα για ανάγνωση
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Λαμβάνουμε το κλείδωμα για εγγραφή
        data[key] = value
        rwmu.Unlock() // Απελευθερώνουμε το κλείδωμα για εγγραφή
    }
    

Οι βασικές διαφορές μπορούν να συνοψιστούν στον παρακάτω πίνακα:

Χαρακτηριστικό sync.Mutex sync.RWMutex
Τύπος κλειδώματος Αποκλειστικό (ανάγνωση/εγγραφή) Κοινόχρηστο (ανάγνωση) + αποκλειστικό (εγγραφή)
Ταυτόχρονη πρόσβαση Ένα goroutine Πολλά goroutines για ανάγνωση, ένα για εγγραφή
Μέθοδος κλειδώματος για ανάγνωση Lock() RLock()
Μέθοδος κλειδώματος για εγγραφή Lock() Lock()
Μέθοδος απελευθέρωσης για ανάγνωση Unlock() RUnlock()
Μέθοδος απελευθέρωσης για εγγραφή Unlock() Unlock()
Απόδοση Απλούστερο, πιθανώς πιο αργό σε συχνές αναγνώσεις Πιο πολύπλοκο, πιθανώς ταχύτερο σε συχνές αναγνώσεις και σπάνιες εγγραφές