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")