Sobes.tech
Junior — Middle

შესაძლებელია თუ არა უსაფრთხოების უზრუნველყოფა ერთდროულად რამდენიმე ნაკადიდან Map-ში ჩაწერისას?

sobes.tech AI

პასუხი AI-სგან

Go-ში სტანდარტული რუკა (map) არ არის უსაფრთხო ერთდროულად რამდენიმე goroutine-დან დაწერისთვის. თუ რამდენიმე goroutine ერთდროულად წერს map-ზე სინქრონიზაციის გარეშე, ეს გამოიწვევს პანიკას.

უსაფრთხოების უზრუნველსაყოფად ერთდროულად დაწერისას, შეგიძლიათ:

  • გამოიყენოთ mutex (sync.Mutex ან sync.RWMutex) წვდომის დაცვისთვის map-ზე.
  • გამოიყენოთ სპეციალიზებული, ერთდროულად უსაფრთხო მონაცემთა სტრუქტურები, როგორიცაა sync.Map, რომელიც განკუთვნილია კონკურენტული წვდომისთვის.

მაგალითი mutex-თან:

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

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

ან გამოიყენეთ sync.Map:

var m sync.Map

func safeWrite(key string, value int) {
    m.Store(key, value)
}

ამგვარად, ერთდროულად დაწერის უსაფრთხოებისთვის საჭიროა სინქრონიზაცია.