Sobes.tech
Middle

Care este diferența dintre RW Mutex și un mutex obișnuit?

sobes.tech AI

Răspuns de la AI

sync.RWMutex permite mai multor goroutines să citească datele în același timp, dar doar o goroutine poate scrie datele la un moment dat. sync.Mutex blochează accesul pentru orice altă goroutine care încearcă să obțină blocarea (fie pentru citire, fie pentru scriere), până când prima goroutine eliberează blocarea.

  • sync.Mutex: Blocare exclusivă. Este fie blocată, fie nu. Doar o goroutine poate menține mutex-ul într-un moment dat. Potrivit atunci când operațiile de citire și scriere sunt frecvente sau au o durată similară.

    // Exemplu de utilizare Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Blocare pentru citire și scriere. Permite mai multor goroutines să mențină blocarea pentru citire în același timp, dar blocarea pentru scriere este exclusivă. O goroutine care deține blocarea pentru scriere blochează atât alte operații de scriere, cât și de citire. Goroutines care dețin blocarea pentru citire blochează operațiile de scriere, dar nu și alte operații de citire. Potrivit atunci când operațiile de citire apar mult mai frecvent decât cele de scriere.

    // Exemplu de utilizare RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Obținem blocarea pentru citire
        value := data[key]
        rwmu.RUnlock() // Eliberăm blocarea pentru citire
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Obținem blocarea pentru scriere
        data[key] = value
        rwmu.Unlock() // Eliberăm blocarea pentru scriere
    }
    

Principalele diferențe pot fi rezumate în tabelul de mai jos:

Caracteristică sync.Mutex sync.RWMutex
Tipul de blocare Excluziv (citire/scriere) Partajat (citire) + exclusiv (scriere)
Acces simultan O goroutine Multe goroutines pentru citire, una pentru scriere
Metoda de blocare pentru citire Lock() RLock()
Metoda de blocare pentru scriere Lock() Lock()
Metoda de deblocare pentru citire Unlock() RUnlock()
Metoda de deblocare pentru scriere Unlock() Unlock()
Performanță Mai simplu, potențial mai lent în cazul citirilor frecvente Mai complex, potențial mai rapid în cazul citirilor frecvente și scrierilor rare