Sobes.tech
Middle

Jaké mutexy používáte k zajištění bezpečnosti při práci s mapami v Go?

sobes.tech AI

Odpověď od AI

Pro zajištění bezpečnosti při práci s nekonkurentním přístupem k datovým strukturám, včetně map (map), v Go se používají mutexy z balíčku sync.

  • sync.Mutex: Základní mutex pro vzájemné vyloučení. Používá se k blokování a odblokování částí kódu, kde dochází ke čtení nebo zápisu do mapy.
  • sync.RWMutex: Mutex s sdíleným (čtení) a výlučným (zápis) přístupem. Umožňuje více gorutinám číst z mapy současně, ale pouze jedné zapisovat. Je ideální pro scénáře, kde jsou čtení výrazně častější než zápisy.

Preferovanou volbou pro současnou a bezpečnou práci s mapami je sync.RWMutex, protože zajišťuje lepší výkon při více současných operacích čtení.

Příklad použití 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()   // Zamknutí pro zápis
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Zamknutí pro čtení
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Existuje také specializovaný typ sync.Map, který je optimalizován pro použití v konkurenčních prostředích bez explicitního zamykání mutexy ve většině případů, ale má určitá omezení a jinou API. Pokud je však potřeba flexibilnější kontrola nad zámky nebo specifické scénáře přístupu, je běžnou praxí použití sync.RWMutex nad standardní mapou.