Sobes.tech
Middle — Middle+

შესაძლებელია თუ არა მრავალთროფული გარემოში დამატებითი სინქრონიზაციის გარეშე map კონტეინერში უსაფრთხოდ დაწერა?

sobes.tech AI

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

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

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

  • sync.Mutex ან sync.RWMutex წვდომის დასაკეტად;
  • sync.Map, სტანდარტული ბიბლიოთეკის ნაკადი უსაფრთხო რუკის განხორციელება.

მაგალითი sync.Mutex-თან:

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

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

ასეთ სინქრონიზაციის გარეშე, რუკაში წერა უსაფრთხო არაა.