Sobes.tech
Middle

Qual è la differenza tra RW Mutex e un mutex normale?

sobes.tech AI

Risposta dell'AI

sync.RWMutex consente a più goroutine di leggere i dati contemporaneamente, ma solo una goroutine può scrivere i dati alla volta. sync.Mutex blocca l'accesso a qualsiasi altra goroutine che tenta di ottenere il blocco (sia per leggere che per scrivere), finché la prima goroutine non rilascia il blocco.

  • sync.Mutex: Blocco esclusivo. È bloccato o no. Solo una goroutine può mantenere il mutex in un dato momento. Adatto quando le operazioni di lettura e scrittura sono frequenti o hanno una durata simile.

    // Esempio di utilizzo di Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Blocco per lettura e scrittura. Permette a più goroutine di mantenere il blocco per la lettura contemporaneamente, ma il blocco per la scrittura è esclusivo. Una goroutine che detiene il blocco per la scrittura blocca sia altre operazioni di scrittura che di lettura. Le goroutine che detengono il blocco per la lettura bloccano le operazioni di scrittura, ma non altre operazioni di lettura. Adatto quando le operazioni di lettura sono molto più frequenti di quelle di scrittura.

    // Esempio di utilizzo di RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Otteniamo il blocco per la lettura
        value := data[key]
        rwmu.RUnlock() // Rilasciamo il blocco per la lettura
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Otteniamo il blocco per la scrittura
        data[key] = value
        rwmu.Unlock() // Rilasciamo il blocco per la scrittura
    }
    

Le differenze principali possono essere riassunte nella tabella seguente:

Caratteristica sync.Mutex sync.RWMutex
Tipo di blocco Esclusivo (lettura/scrittura) Condiviso (lettura) + esclusivo (scrittura)
Accesso simultaneo Una goroutine Múltiple goroutine per la lettura, una per la scrittura
Metodo di blocco per la lettura Lock() RLock()
Metodo di blocco per la scrittura Lock() Lock()
Metodo di sblocco per la lettura Unlock() RUnlock()
Metodo di sblocco per la scrittura Unlock() Unlock()
Prestazioni Più semplice, potenzialmente più lento con frequenti letture Più complesso, potenzialmente più veloce con frequenti letture e rare scritture