Sobes.tech
Middle

Aké mutexy používate na zabezpečenie bezpečnosti pri práci s mapami v Go?

sobes.tech AI

Odpoveď od AI

Pre zabezpečenia bezpečnosti pri práci s nekonkurentným prístupom k dátovým štruktúram, vrátane máp (map), v Go sa používajú mutexy z balíka sync.

  • sync.Mutex: Základný mutex pre vzájomné vylúčenie. Používa sa na blokovanie a odblokovanie častí kódu, kde dochádza ku čítaniu alebo zápisu do mapy.
  • sync.RWMutex: Mutex s deleným (čítanie) a výlučným (zápis) prístupom. Umožňuje viacerým gorutinám čítať z mapy súčasne, ale len jednej zapisovať. Ideálny pre scenáre, kde sú čítania výrazne častejšie ako zápisy.

Preferovanou voľbou pre súčasnú a bezpečnú prácu s mapami je sync.RWMutex, pretože zabezpečuje lepší výkon pri viacerých súčasných operáciách čítania.

Príklad použitia 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()   // Zámok pre zápis
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Zámok pre čítanie
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Existuje aj špecializovaný typ sync.Map, ktorý je optimalizovaný pre použitie v konkurenčných prostrediach bez explicitného zamykania mutexmi vo väčšine prípadov, ale má určité obmedzenia a iné API. Ak je však potrebná flexibilnejšia kontrola nad zámkami alebo špecifické scenáre prístupu, používanie sync.RWMutex na štandardnej map je bežnou praxou.