Sobes.tech
Junior — Middle

რა შედეგები შეიძლება გამოიწვიოს ერთდროულად Map-ში სხვადასხვა კონკურენტული gorutin-ებიდან ჩაწერით?

sobes.tech AI

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

Go-да стандартული რუკა (map) უსაფრთხო არაა ერთდროულად წაკითხვასა და დაწერაზე რამდენიმე გორუტინიდან. თუ რამდენიმე გორუტინი ერთდროულად ცდილობს ერთსა და იმავე რუკაში დაწერას სინქრონიზაციის გარეშე, ეს გამოიწვევს მონაცემთა შეჯახებას, runtime-ის პანიკას (фатალური შეცდომა: ერთდროულად დაწერილი რუკაზე) და პროგრამის არაპროგნოზირებად ქცევას.

პრობლემების თავიდან ასაცილებლად, საჭიროა:

  • mutex-ების (sync.Mutex) გამოყენება რუკის წვდომის დასაცავად.
  • სპეციალიზებული, ერთდროულად უსაფრთხო მონაცემთა სტრუქტურები, მაგალითად, 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()
}

ამგვარი დაცვა გარეშე, პროგრამა შეიძლება მოულოდნელად შეწყდეს.