Middle
Ի՞նչ mutex-ներ եք օգտագործում, ապահովելու համար անվտանգությունը Go-ում քարտերով աշխատելիս։
sobes.tech AI
Պատասխան AI-ից
Որպեսզի ապահովվի անվտանգությունը տվյալների կառուցվածքների հետ աշխատելիս, ներառյալ քարտեզները (map), Go-ում օգտագործվում են sync փաթեթի mutex-ներ:
sync.Mutex: Հիմնական mutex՝ փոխադարձ բացառության համար: Օգտագործվում է կոդի հատվածների փակման և բացման համար, որտեղ կատարվում է ընթերցում կամ գրառում քարտեզում:sync.RWMutex: Կիսաբաժան (ընթերցում) և բացառիկ (գրառում) մուտք ունեցող mutex: Հնարավորություն է տալիս միաժամանակ մի քանի goroutine-ների ընթերցել քարտեզից, բայց միայն մեկին՝ գրել:
Նախընտրելի տարբերակն է sync.RWMutex-ը, քանի որ այն ապահովում է ավելի լավ կատարողականություն միաժամանակյա ընթերցումների դեպքում:
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() // Բլոկավորում գրելու համար
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Բլոկավորում ընթերցելու համար
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Կա նաև sync.Map հատուկ տիպ, որը օպտիմալիզացված է միաժամանակյա օգտագործման համար առանց mutex-ների բացահայտ փակման, սակայն ունի որոշ սահմանափակումներ և այլ API: Եթե անհրաժեշտ է ավելի ճկուն վերահսկողություն mutex-ների վրա կամ հատուկ մուտքի սցենարներ, sync.RWMutex-ի օգտագործումը սովորական պրակտիկա է։