Est-il possible d'assurer la sécurité lors de la lecture simultanée de données à partir de Map dans un environnement multithread?
sobes.tech IA
Réponse de l'IA
Dans Go, une carte standard (map) n’est pas sûre pour un accès concurrent. Si plusieurs goroutines lisent du map sans écrire, c’est sûr. Cependant, si au moins une goroutine écrit dans le map, la lecture et l’écriture simultanées entraîneront une panique.
Pour une lecture sûre du map sans écriture, vous pouvez utiliser un map normal sans synchronisation. Mais si une écriture est possible, il faut utiliser une synchronisation, par exemple via sync.RWMutex ou en utilisant sync.Map, qui est spécialement conçu pour un accès concurrent.
Exemple avec sync.RWMutex pour une lecture et une écriture sûres:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Écriture
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Lecture
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Si vous garantissez que le map ne change pas après l'initialisation, alors la lecture simultanée est sûre sans synchronisation supplémentaire.