Sobes.tech
Junior — Middle

Արդյոք անվտանգ է օգտագործել ընդհանուր ռեսուրսներ, ինչպիսիք են Map-ը, միաժամանակ մի քանի goroutine-ներից օգտվելիս?

sobes.tech AI

Պատասխան AI-ից

Ոչ, Go-ի ստանդարտ քարտեզը (map) չի ապահովում թրեդ-բանաձևություն և չի կարող միաժամանակ օգտագործվել մի քանի գորուտիներից առանց լրացուցիչ սինխրոնիզացիայի: Անվտանգ մուտքը կարող է առաջացնել մրցակցության պայմաններ և панիկ:

Անվտանգ օգտագործման համար ընդհանուր ռեսուրսների, ինչպիսիք են քարտեզները, բազմատրեդ միջավայրում, կարող եք:

  • Օգտագործել sync.Mutex կամ sync.RWMutex՝ մուտքի պաշտպանելու համար:
  • Օգտագործել sync.Map՝ հատուկ և թրեդ-անվտանգ տվյալների կառուցվածք քարտեզների համար:

mutex-ով օրինակ:

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

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

func read(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}

sync.Map-ի օգտագործում:

var m sync.Map

m.Store("key", 42)
value, ok := m.Load("key")