Sobes.tech
Middle

Jaký je rozdíl mezi RW Mutex a běžným mutexem?

sobes.tech AI

Odpověď od AI

sync.RWMutex umožňuje více gorutinám současně číst data, ale pouze jedné gorutině zapisovat data. sync.Mutex blokuje přístup jakékoli jiné gorutině, která se pokusí získat zámek (ať už pro čtení nebo zápis), dokud první gorutina neuvolní zámek.

  • sync.Mutex: Exkluzivní zámek. Buď je zámek aktivní, nebo není. Pouze jedna gorutina může držet mutex v daném okamžiku. Vhodné, když operace čtení a zápisu jsou časté nebo mají podobnou dobu trvání.

    // Příklad použití Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Zámek pro čtení a zápis. Umožňuje více gorutinám držet zámek pro čtení současně, ale zámek pro zápis je exkluzivní. Gorutina, která drží zámek pro zápis, blokuje jakékoli jiné zápisy i čtení. Gorutiny držící zámek pro čtení blokují zápisy, ale ne jiné čtení. Vhodné, když operace čtení jsou výrazně častější než zápisy.

    // Příklad použití RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Získání zámku pro čtení
        value := data[key]
        rwmu.RUnlock() // Uvolnění zámku pro čtení
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Získání zámku pro zápis
        data[key] = value
        rwmu.Unlock() // Uvolnění zámku pro zápis
    }
    

Hlavní rozdíly lze shrnout v tabulce:

Charakteristika sync.Mutex sync.RWMutex
Typ zámku Exkluzivní (čtení/zápis) Sdílený (čtení) + exkluzivní (zápis)
Současný přístup Jedna gorutina Více gorutin pro čtení, jedna pro zápis
Metoda zámku pro čtení Lock() RLock()
Metoda zámku pro zápis Lock() Lock()
Metoda odemčení pro čtení Unlock() RUnlock()
Metoda odemčení pro zápis Unlock() Unlock()
Výkon Jednodušší, potenciálně pomalejší při častém čtení Složitější, potenciálně rychlejší při častém čtení a vzácném zápisu