Sobes.tech
Junior — Middle

Bir neçə goroutine eyni zamanda xəritədə eyni açara daxil olmağa çalışarsa nə baş verir?

sobes.tech Süni İntellekt

AI-dan cavab

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ə/və ya 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]
}