Middle
Go-da xəritələrlə işləyərkən təhlükəsizliyi təmin etmək üçün hansı mutexlərdən istifadə edirsiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Go-da məlumat strukturları ilə, o cümlədən xəritələr (map) ilə eyni vaxtda girişin təhlükəsizliyini təmin etmək üçün sync paketindən mutexlər istifadə olunur.
sync.Mutex: Əsas mutex, qarşılıqlı istisna üçün. Map üzərində oxuma və ya yazma əməliyyatları zamanı kod hissələrini kilidləmək və açmaq üçün istifadə olunur.sync.RWMutex: Paylaşılan (oxuma) və müstəsna (yazma) giriş ilə mutex. Bir neçə goroutine mapdan eyni vaxtda oxuya bilər, amma yalnız biri yaza bilər. Bu, oxuma əməliyyatlarının yazma əməliyyatlarından çox olduğu ssenarilər üçün idealdır.
Map ilə çoxsaylı və təhlükəsiz işləmək üçün üstünlük verilən seçim sync.RWMutex-dir, çünki çoxsaylı eyni vaxtda oxuma əməliyyatlarında daha yaxşı performans təmin edir.
sync.RWMutex istifadə nümunəsi:
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]int),
}
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock() // Yazma üçün kilidləmə
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Oxuma üçün kilidləmə
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Həmçinin, çox hallarda mutex ilə açıq kilidləmədən istifadə üçün optimallaşdırılmış sync.Map adlı xüsusi tip də mövcuddur, lakin müəyyən məhdudiyyətlər və fərqli API-ya malikdir. Əgər daha çevik kilidləmə nəzarəti və ya xüsusi giriş ssenariləri tələb olunursa, sync.RWMutex-in standart map üzərində istifadəsi geniş yayılmış praktikadır.