Sobes.tech
Junior — Middle

შესაძლებელია თუ არა უსაფრთხოდ გამოიყენოთ საერთო რესურსები, როგორიცაა Map, ერთდროულად რამდენიმე goroutine-დან წვდომისას?

sobes.tech AI

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

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

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

  • გამოიყენოთ 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")