Sobes.tech
Junior — Middle

რა მოხდება, თუ ერთდროულად რამდენიმე გორუტინი ერთსა და იმავე გასაღებს მიაღწევს რუკაში?

sobes.tech AI

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

Go dilində, xəritə (map) çox iplikli təhlükəsiz məlumat quruluşu deyil. Əgər bir neçə goroutine eyni zamanda xəritəyə oxuma və/yaxud yazma cəhd edərsə, bu, yarış şəraitlərinə və ehtimal ki, işləmə zamanı panikaya səbəb olacaq.

Bunun qarşısını almaq üçün, sinxronizasiya mexanizmlərindən istifadə etmək lazımdır, məsələn:

  • sync.Mutex istifadə edərək xəritəyə girişin bloklanması.
  • sync.RWMutex istifadə edərək oxuma və yazma kilidlərinin ayrılması.
  • Xüsusi strukturlar, məsələn, sync.Map, ki, bu, çox iplikli giriş üçün təhlükəsizdir.

sync.Mutex istifadə edərək xəritəni qoruma nümunəsi:

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

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

func read(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}