Sobes.tech
Junior — Middle

Kas on võimalik turvaliselt lugeda andmeid map-andmesstruktuurist ilma vigade tekkimise riskita?

sobes.tech AI

Vastus AI-lt

Go keeles, kaardi lugemine on ohutu, kui keegi seda sel ajal ei muuda. Kuid kui paralleelselt toimub kirjutamine (lisamine, eemaldamine või elementide muutmine), võib lugemine põhjustada paanikaga (jooksu viga).

Turvalise lugemise tagamiseks mitme niidiga keskkonnas kasutatakse tavaliselt:

  • sync.RWMutex — kaardi lukustamine kirjutamiseks ja paralleelse lugemise lubamine
  • sync.Map — spetsialiseeritud ja turvaline andmestruktuur kaartidele

Näide RWMutex-ga:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = val
}

Seega on turvaline lugemine võimalik, kui tagatakse sünkroniseerimine kirjutamisega.