Sobes.tech
Middle

Mi a különbség az RW Mutex és egy normál mutex között?

sobes.tech MI

Válasz az MI-től

sync.RWMutex lehetővé teszi, hogy több goroutine egyidejűleg olvassa az adatokat, de csak egy goroutine írhat egyszerre adatokat. A sync.Mutex blokkolja a hozzáférést minden más goroutine előtt, amely megpróbálja megszerezni a zárolást (legyen az olvasás vagy írás), amíg az első goroutine nem szabadítja fel a zárolást.

  • sync.Mutex: Kizárólagos zárolás. Vagy zárolva van, vagy nincs. Csak egy goroutine tarthatja a mutexet egy adott időben. Akkor alkalmas, ha az olvasási és írási műveletek gyakoriak vagy hasonló időtartamúak.

    // Mutex használat példája
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Olvasási és írási zárolás. Lehetővé teszi, hogy több goroutine tartson zárolást olvasásra egyidejűleg, de az írás zárolása kizárólagos. Egy goroutine, amely tartja az írás zárolását, blokkolja a többi írási és olvasási műveletet. Az olvasási zárolást tartó goroutine-ok blokkolják az írási műveleteket, de nem más olvasási műveleteket. Akkor alkalmas, ha az olvasási műveletek sokkal gyakoribbak, mint az írási.

    // RWMutex használat példája
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Olvasási zárolás megszerzése
        value := data[key]
        rwmu.RUnlock() // Olvasási zárolás feloldása
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Írási zárolás megszerzése
        data[key] = value
        rwmu.Unlock() // Írási zárolás feloldása
    }
    

A fő különbségek összefoglalhatók az alábbi táblázatban:

Jellemző sync.Mutex sync.RWMutex
Zárolás típusa Kizárólagos (olvasás/írás) Megosztott (olvasás) + kizárólagos (írás)
Egyidejű hozzáférés Egy goroutine Több goroutine az olvasáshoz, egy a íráshoz
Zárolási módszer olvasáshoz Lock() RLock()
Zárolási módszer íráshoz Lock() Lock()
Feloldási módszer olvasáshoz Unlock() RUnlock()
Feloldási módszer íráshoz Unlock() Unlock()
Teljesítmény Egyszerűbb, potenciálisan lassabb gyakori olvasás esetén Bonyolultabb, potenciálisan gyorsabb gyakori olvasás és ritka írás esetén