Kuo skiriasi RW Mutex nuo įprasto mutex?
sobes.tech AI
Atsakymas iš AI
sync.RWMutex leidžia kelioms gorutinoms vienu metu skaityti duomenis, tačiau tik viena gorutina gali rašyti duomenis. sync.Mutex blokuoja prieigą bet kuriai kitai gorutinai, kuri bando gauti užraktą (nesvarbu ar skaityti ar rašyti), kol pirmoji gorutina neužleis užrakto.
-
sync.Mutex: Išskirtinis užraktas. Ar užrakintas, ar ne. Tik viena gorutina gali laikyti mutex vienu metu. Tinka, kai skaitymo ir rašymo operacijos dažnos arba trunka panašiai.// Pavyzdys naudojant Mutex var mu sync.Mutex var counter int func increment() { mu.Lock() counter++ mu.Unlock() } -
sync.RWMutex: Skaitymo ir rašymo užraktas. Leidžia kelioms gorutinoms vienu metu skaityti duomenis, tačiau rašymo užraktas yra išskirtinis. Gorutina, turinti rašymo užraktą, blokuoja kitus rašymo ir skaitymo veiksmus. Gorutinos, turinčios skaitymo užraktą, blokuoja rašymo veiksmus, bet ne kitus skaitymo. Tinka, kai skaitymo operacijos yra žymiai dažnesnės nei rašymo.// Pavyzdys naudojant RWMutex var rwmu sync.RWMutex var data map[string]string = make(map[string]string) func readData(key string) string { rwmu.RLock() // Gauti skaitymo užraktą value := data[key] rwmu.RUnlock() // Atlaisvinti skaitymo užraktą return value } func writeData(key, value string) { rwmu.Lock() // Gauti rašymo užraktą data[key] = value rwmu.Unlock() // Atlaisvinti rašymo užraktą }
Pagrindiniai skirtumai gali būti apibendrinti lentelėje:
| Savybė | sync.Mutex |
sync.RWMutex |
|---|---|---|
| Užrakto tipas | Išskirtinis (skaitymas/rašymas) | Bendras (skaitymas) + išskirtinis (rašymas) |
| Vienu metu prieiga | Viena gorutina | Daug gorutinų skaitymui, viena rašymui |
| Užrakto metodas skaitymui | Lock() |
RLock() |
| Užrakto metodas rašymui | Lock() |
Lock() |
| Atlaisvinimo metodas skaitymui | Unlock() |
RUnlock() |
| Atlaisvinimo metodas rašymui | Unlock() |
Unlock() |
| Našumas | Paprastas, galimai lėtesnis dažnam skaitymui | Sudėtingesnis, galimai greitesnis dažnam skaitymui ir retam rašymui |