Sobes.tech
Middle — Middle+

Jak zajistit bezpečnou práci s kolekcí Map v prostředí s více vlákny?

sobes.tech AI

Odpověď od AI

V Go není standardní mapa (mapa) bezpečná pro současné čtení a zápis z různých gorutin. Aby bylo možné bezpečně pracovat s mapou v prostředí s více vlákny, lze použít následující přístupy:

  1. Synchronizace pomocí mutexu

Použijte sync.Mutex nebo sync.RWMutex k ochraně přístupu k mapě. Při zápisu zamkněte mutex pro zápis, při čtení — pro čtení (pokud používáte 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. Použití sync.Map

V Go existuje specializovaná struktura sync.Map, optimalizovaná pro konkurenční přístup a nevyžadující ruční synchronizaci.

import "sync"

var m sync.Map

// Zápis
m.Store("key", 42)

// Čtení
val, ok := m.Load("key")
  1. Použití kanálů (channels)

Přístup ke mapě lze organizovat přes gorutinu, která zpracovává požadavky na čtení a zápis přes kanály, čímž zajišťuje sekvenční přístup.

Volba metody závisí na konkrétních požadavcích na výkon a složitost implementace.