Sobes.tech
Middle

Milyen mutexeket használsz a biztonság biztosítására a térképekkel való munkában Go-ban?

sobes.tech MI

Válasz az MI-től

A Go-ban a nem versenyképes hozzáférés biztonságának biztosítására adatstruktúrák, például térképek (map) esetén a sync csomag mutexeit használják.

  • sync.Mutex: Alapvető mutex a kölcsönös kizáráshoz. A térképen végzett olvasási vagy írási szakaszok zárolására és feloldására szolgál.
  • sync.RWMutex: Megosztott (olvasási) és kizárólagos (írási) hozzáférést biztosító mutex. Lehetővé teszi több goroutine számára, hogy egyszerre olvassanak a térképből, de csak egy írhat. Ideális olyan forgatókönyvekhez, ahol az olvasások jelentősen meghaladják az írásokat.

Az egyik legjobb választás a térképekkel való párhuzamos, biztonságos munkához a sync.RWMutex, mivel jobb teljesítményt nyújt több egyidejű olvasási művelet esetén.

A sync.RWMutex használatának példája:

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árolás írásra
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Zárolás olvasásra
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Ezen kívül létezik egy specializált típus, a sync.Map, amely optimalizált a konkurens használatra mutexek explicit zárolása nélkül a legtöbb esetben, de bizonyos korlátozásokkal és más API-val rendelkezik. Ha azonban rugalmasabb vezérlésre vagy specifikus hozzáférési forgatókönyvekre van szükség, a sync.RWMutex használata egy általánosan elfogadott gyakorlat a standard map felett.