Senior
Kādi konkurences piekļuves problēmas rodas, izsaucot Get un Set metodes no dažādām gorutinām? Kā tās risināt?
sobes.tech AI
Atbilde no AI
Kad laikā, kad dažādas gorutīnas vienlaikus izsauc metodes Get un Set, rodas datu sacensību (data race) problēma. Tas notiek tāpēc, ka vairākas gorutīnas var vienlaikus lasīt un mainīt kopīgus datus, kas noved pie neparedzamas uzvedības un kļūdām.
Lai šo problēmu risinātu Go valodā, parasti izmanto:
- Mutex (sync.Mutex) — bloķē piekļuvi datiem operācijas laikā, nodrošinot ekskluzīvu piekļuvi.
- RWMutex (sync.RWMutex) — ļauj vairākām gorutīnām vienlaikus lasīt datus, bet bloķē rakstīšanu, ja kāds raksta.
- Kanāli (channels) — organizē secīgu piekļuvi datiem, pārraugot ziņojumu sūtīšanu.
Piemērs ar RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // lasīšanas bloķēšana
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // rakstīšanas bloķēšana
defer m.mu.Unlock()
m.data[key] = value
}
Šī pieeja nodrošina, ka dati netiks bojāti vienlaicīgas piekļuves laikā.