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 |