Middle
Kokius mutexus naudojate, kad užtikrintumėte saugumą dirbdami su žemėlapiais Go?
sobes.tech AI
Atsakymas iš AI
Siekiant užtikrinti saugumą dirbant su nesankcionuotu prieiga prie duomenų struktūrų, įskaitant žemėlapius (map), Go kalboje naudojami sync paketo mutex'ai.
sync.Mutex: Pagrindinis mutex, skirtas tarpusavio išskyrimui. Naudojamas blokuoti ir atblokuoti kodo dalis, kuriose vyksta skaitymas arba rašymas į žemėlapį.sync.RWMutex: Dalijamasis (skaitymo) ir išskirtinis (rašymo) prieigos mutex. Leidžia kelioms gorutinoms vienu metu skaityti iš žemėlapio, bet tik vienai rašyti. Idealiai tinka scenarijams, kur skaitymų skaičius žymiai didesnis nei rašymų.
Populiariausias pasirinkimas dirbant su žemėlapiais yra sync.RWMutex, nes jis užtikrina geresį našumą atliekant kelių vienu metu vykdomų skaitymo operacijų.
sync.RWMutex naudojimo pavyzdys:
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() // Užrakinimas rašymui
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Užrakinimas skaitymui
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Taip pat egzistuoja specializuotas tipas sync.Map, kuris yra optimizuotas naudoti konkurencinėse aplinkose be aiškaus mutex užrakinimo daugeliu atvejų, tačiau turi tam tikrų apribojimų ir kitokią API. Jei reikalinga lankstesnė kontrolė mutex'ų užrakinimui ar specifiniai prieigos scenarijai, sync.RWMutex naudojimas standartiniame map yra įprasta praktika.