Sobes.tech
Junior — Middle

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

sobes.tech AI

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

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

უსაფრთხო ერთდროული წაკითხვა map-დან წერილის გარეშე, შეიძლება გამოიყენოთ ჩვეულებრივი map გარეშე სინქრონიზაციის. მაგრამ თუ არსებობს წერის შესაძლებლობა, საჭიროა სინქრონიზაციის გამოყენება, მაგალითად, sync.RWMutex ან sync.Map, რომელიც სპეციალურად შექმნილია კონკურენტული წვდომისთვის.

მაგალითი sync.RWMutex-თან უსაფრთხო წაკითხვა და წერა:

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

// წერა
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// წაკითხვა
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

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