Sobes.tech
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ā.