Sobes.tech
Junior — Middle

Көп жиптүү чөйрөдө Map менен иштөөдө коопсуздукту кантип камсыз кылса болот?

sobes.tech AI

AIден жооп

Go тилинде стандарттык карта (map) ар кандай горутиндерден бир убакта окуу жана жазуу үчүн коопсуз эмес. Көптөгөн жиптер менен иштөөдө карта менен иштөөдө коопсуздукту камсыз кылуу үчүн төмөнкүлөрдү колдонсо болот:

  1. Мьютекс (sync.Mutex же sync.RWMutex) — окуу/жазуу учурунда картага кирүүнү бөгөттөйт.
var (
    m = make(map[string]int)
    mu sync.RWMutex
)

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

func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}
  1. sync.Map — стандарт китепканадан атайын иштелип чыккан, көп жиптер үчүн коопсуз структура, көп goroutine үчүн оптималдаштырылган.
var m sync.Map

func write(key string, value int) {
    m.Store(key, value)
}

func read(key string) (int, bool) {
    val, ok := m.Load(key)
    if !ok {
        return 0, false
    }
    return val.(int), true
}

Тандоо конкреттүү тапшырга жараша болот: көп жазуу жана окуу операциялары керек болсо, мьютекс колдонуу жакшы; эгер негизинен окуу болсо, sync.Map натыйжалуу болушу мүмкүн.