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
Patricia Arquetteoriginal
2024-12-31 04:09:40443parcourir

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)

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
})

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

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!

Déclaration:
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