Aký je rozdiel medzi RW Mutex a bežným mutexom?
sobes.tech AI
Odpoveď od AI
sync.RWMutex umožňuje viacerým gorutinám súčasne čítať dáta, ale iba jednej gorutine zapisovať dáta. sync.Mutex blokuje prístup pre akúkoľvek inú gorutinu, ktorá sa pokúsi získať zámok (či už na čítanie alebo zápis), kým prvá gorutina neuvoľní zámok.
-
sync.Mutex: Exkluzívny zámok. Buď je zámok aktívny, alebo nie. Iba jedna gorutina môže držať mutex v danom momente. Vhodné, keď operácie čítania a zápisu sú časté alebo majú podobnú dobu trvania.// Príklad použitia Mutex var mu sync.Mutex var counter int func increment() { mu.Lock() counter++ mu.Unlock() } -
sync.RWMutex: Zámok pre čítanie a zápis. Umožňuje viacerým gorutinám držať zámok pre čítanie súčasne, ale zámok pre zápis je exkluzívny. Gorutina, ktorá drží zámok pre zápis, blokuje akékoľvek iné zápisy aj čítania. Gorutiny držace zámok pre čítanie blokujú zápisy, ale nie iné čítania. Vhodné, keď operácie čítania sú výrazne častejšie než operácie zápisu.// Príklad použitia RWMutex var rwmu sync.RWMutex var data map[string]string = make(map[string]string) func readData(key string) string { rwmu.RLock() // Získanie zámku pre čítanie value := data[key] rwmu.RUnlock() // Uvoľnenie zámku pre čítanie return value } func writeData(key, value string) { rwmu.Lock() // Získanie zámku pre zápis data[key] = value rwmu.Unlock() // Uvoľnenie zámku pre zápis }
Hlavné rozdiely možno zhrnúť v tabuľke:
| Charakteristika | sync.Mutex |
sync.RWMutex |
|---|---|---|
| Typ zámku | Exkluzívny (čítanie/zápis) | Zdieľaný (čítanie) + exkluzívny (zápis) |
| Súčasný prístup | Jedna gorutina | Viac gorutín pre čítanie, jedna pre zápis |
| Metóda zámku pre čítanie | Lock() |
RLock() |
| Metóda zámku pre zápis | Lock() |
Lock() |
| Metóda odomknutia pre čítanie | Unlock() |
RUnlock() |
| Metóda odomknutia pre zápis | Unlock() |
Unlock() |
| Výkon | Jednoduchšie, potenciálne pomalšie pri častom čítaní | Zložitejšie, potenciálne rýchlejšie pri častom čítaní a zriedkavom zápise |