Maison > développement back-end > Golang > Comment résoudre « erreur fatale : lecture et écriture de carte simultanées » dans Go ?

Comment résoudre « erreur fatale : lecture et écriture de carte simultanées » dans Go ?

Patricia Arquette
Libérer: 2024-12-31 04:09:40
original
428 Les gens l'ont consulté

How to Solve the

"Erreur fatale Golang : lecture et écriture de carte simultanées" expliquée

L'erreur "Erreur fatale : lecture et écriture de carte simultanées" dans Go se produit lorsque plusieurs goroutines essayez d'accéder à une carte simultanément pour la lecture et l'écriture. Cela peut se produire lorsqu'une goroutine essaie de lire la carte pendant qu'une autre goroutine y écrit simultanément.

Solutions

sync.RWMutex

Utiliser un sync.RWMutex pour contrôler l'accès à la carte. Cette option convient aux scénarios avec des lectures et des écritures uniques (pas de boucles sur la carte).

var someMap = map[string]string{}
var someMapMutex = sync.RWMutex{}

go func() {
    someMapMutex.Lock()
    someMap["key"] = "value"
    someMapMutex.Unlock()
}()

someMapMutex.RLock()
v, ok := someMap["key"]
someMapMutex.RUnlock()
if !ok {
    fmt.Println("key missing")
    return
}
fmt.Println(v)
Copier après la connexion

syncmap.Map

Une alternative consiste à utiliser une syncmap .Map{}, qui est un type de carte simultané dans Go. Elle gère les conditions de course en interne et est généralement plus lente qu'une carte classique. Cependant, il excelle dans les scénarios de boucle for.

var someMap = syncmap.Map{}

go func() {
    someMap.Store("key", "value")
}()

v, ok := someMap.Load("key")
if !ok {
    fmt.Println("key missing")
    return
}
fmt.Println(v)

// Looping over keys is simplified with syncmap
someMap.Range(func(key, value interface{}) bool {
    val, ok := value.(string)
    if !ok {
        return false // Break iteration
    }
    fmt.Println(key, val)
    return true // Continue iteration
})
Copier après la connexion

Conseils généraux

Pour éviter cette erreur, il est recommandé de tester votre serveur avec l'option -race pour identifier et éliminer les conditions de concurrence potentielles. .

go run -race server.go
Copier après la connexion

En implémentant ces solutions et en suivant ces directives, vous pouvez éviter l'erreur « lecture et écriture de carte simultanées » et garantir un accès sécurisé aux threads partagés. données dans votre code Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal