Sobes.tech
Middle

Mis vahe on RW Mutex ja tavalise mutexi vahel?

sobes.tech AI

Vastus AI-lt

sync.RWMutex võimaldab mitmel gorutinil samaaegselt andmeid lugeda, kuid ainult üks gorutin võib andmeid kirjutada. sync.Mutex blokeerib juurdepääsu igale teisele gorutinile, kes üritab saada lukustust (kas lugemiseks või kirjutamiseks), kuni esimene gorutin vabastab lukustuse.

  • sync.Mutex: Eksklusiivne lukustus. Kas see on lukustatud või mitte. Ainult üks gorutin võib hoida mutexi ühe korraga. Sobib, kui lugemis- ja kirjutamisoperatsioonid on sagedased või sarnase kestusega.

    // Näide Mutexi kasutamisest
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Lugemis- ja kirjutuslukustus. Annab mitmele gorutinile võimaluse samaaegselt andmeid lugeda, kuid kirjutuslukustus on eksklusiivne. Gorutin, kellel on kirjutuslukustus, blokeerib teised kirjutus- ja lugemisoperatsioonid. Gorutinid, kellel on lugemislukustus, blokeerivad kirjutusoperatsioonid, kuid mitte teisi lugemisoperatsioone. Sobib, kui lugemisoperatsioonid on oluliselt sagedasemad kui kirjutus.

    // Näide RWMutex kasutamisest
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Saame lugemislukustuse
        value := data[key]
        rwmu.RUnlock() // Vabastame lugemislukustuse
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Saame kirjutuslukustuse
        data[key] = value
        rwmu.Unlock() // Vabastame kirjutuslukustuse
    }
    

Peamised erinevused saab kokku võtta tabelis:

Omadus sync.Mutex sync.RWMutex
Lukustuse tüüp Eksklusiivne (lugemine/kirjutamine) Ühine (lugemine) + eksklusiivne (kirjutamine)
Samaaegne juurdepääs Üks gorutin Mitme gorutini lugemine, üks kirjutamine
Lukustuse meetod lugemiseks Lock() RLock()
Lukustuse meetod kirjutamiseks Lock() Lock()
Vabastamise meetod lugemiseks Unlock() RUnlock()
Vabastamise meetod kirjutamiseks Unlock() Unlock()
Tõhusus Lihtsam, võib olla aeglasem sagedase lugemise korral keerulisem, võib olla kiirem sagedase lugemise ja harva kirjutamise korral