Sobes.tech
Middle — Middle+

Kaip užtikrinti saugų darbą su Map kolekcija daugiagijų aplinkoje?

sobes.tech AI

Atsakymas iš AI

Go standartinė kortelė (map) nėra saugi vienu metu skaityti ir rašyti iš skirtingų gorutinių. Norint užtikrinti saugų darbą su kortele daugiagijų aplinkoje, galima naudoti šiuos požiūrius:

  1. Sinchronizacija naudojant mutex

Naudokite sync.Mutex arba sync.RWMutex kortelės prieigos apsaugai. Rašymo metu užrakinkite mutex rašymui, skaitymo metu — skaitymui (jei naudojate RWMutex).

import "sync"

type SafeMap struct {
    mu sync.RWMutex
    m  map[string]int
}

func (s *SafeMap) Get(key string) (int, bool) {
    s.mu.RLock()
    defer s.mu.RUnlock()
    val, ok := s.m[key]
    return val, ok
}

func (s *SafeMap) Set(key string, val int) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.m[key] = val
}
  1. Naudojant sync.Map

Go turi specialią sync.Map struktūrą, optimizuotą konkurenciniam prieigai ir nereikalaujančią rankinio sinchronizavimo.

import "sync"

var m sync.Map

// Rašymas
m.Store("key", 42)

// Skaitymas
val, ok := m.Load("key")
  1. Naudojant kanalus (channels)

Prieiga prie kortelės gali būti organizuota per goroutine, kuri tvarko skaitymo ir rašymo užklausas per kanalus, užtikrinant seką.

Pasirinkimas priklauso nuo konkrečių našumo ir įgyvendinimo sudėtingumo reikalavimų.