Sobes.tech
Middle

Kāda ir atšķirība starp RW Mutex un parasto mutex?

sobes.tech AI

Atbilde no AI

sync.RWMutex ļauj vairākām gorutinām vienlaikus lasīt datus, bet tikai viena gorutina var rakstīt datus. sync.Mutex bloķē piekļuvi jebkurai citai gorutinei, kas mēģina iegūt bloķējumu (lasīšanai vai rakstīšanai), kamēr pirmā gorutina neatslābinās bloķējumu.

  • sync.Mutex: Ekskluzīvs bloķējums. Vai tas ir bloķēts, vai nav. Tikai viena gorutina var turēt mutex vienlaikus. Piemērots, kad lasīšanas un rakstīšanas operācijas ir biežas vai ilgst līdzīgi.

    // Piemērs ar Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Lasīšanas un rakstīšanas bloķējums. Atļauj vairākām gorutinām vienlaikus lasīt datus, bet rakstīšanas bloķējums ir ekskluzīvs. Gorutina, kas tur rakstīšanas bloķējumu, bloķē citas rakstīšanas un lasīšanas operācijas. Gorutinas, kas tur lasīšanas bloķējumu, bloķē rakstīšanas operācijas, bet ne citas lasīšanas. Piemērots, kad lasīšanas operācijas ir būtiski biežākas nekā rakstīšanas.

    // Piemērs ar RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Iegūst lasīšanas bloķējumu
        value := data[key]
        rwmu.RUnlock() // Atbrīvo lasīšanas bloķējumu
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Iegūst rakstīšanas bloķējumu
        data[key] = value
        rwmu.Unlock() // Atbrīvo rakstīšanas bloķējumu
    }
    

Galvenās atšķirības var apkopot tabulā:

Raksturlielums sync.Mutex sync.RWMutex
Bloķēšanas veids Ekskluzīvs (lasīšana/rakstīšana) Kopīgs (lasīšana) + ekskluzīvs (rakstīšana)
Vienlaicīga pieeja Viena gorutina Daudzas gorutinas lasīšanai, viena rakstīšanai
Metode lasīšanai Lock() RLock()
Metode rakstīšanai Lock() Lock()
Atbrīvošanas metode lasīšanai Unlock() RUnlock()
Atbrīvošanas metode rakstīšanai Unlock() Unlock()
Veiktspēja Vienkāršāks, iespējams lēnāks biežai lasīšanai Sarežģītāks, iespējams ātrāks biežai lasīšanai un retai rakstīšanai