Maison >développement back-end >Golang >Comment puis-je empêcher les plantages d'écriture de carte simultanée dans Go ?

Comment puis-je empêcher les plantages d'écriture de carte simultanée dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-14 01:58:09274parcourir

How Can I Prevent Concurrent Map Write Crashes in Go?

Prévention des crashs d'écriture simultanés de cartes

Lorsque vous tentez d'écrire simultanément sur la même carte à partir de plusieurs goroutines, Go 1.6 déclenche un crash délibéré pour empêcher corruption des données. Contrairement aux paniques qui peuvent être récupérées en utilisant defer et recovery, ce crash est intentionnel et ne peut pas être intercepté.

Pour résoudre ce problème, évitez les écritures simultanées sur les cartes. Dans l'exemple fourni :

package main

import "time"

var m = make(map[string]string)

func main() {
    go func() { // Rewrite m["x"] = "foo" in a loop
        for {
            m["x"] = "foo"
        }
    }()
    go func() { // Rewrite m["x"] = "foo" in a loop
        for {
            m["x"] = "bar"
        }
    }()

    time.Sleep(1 * time.Second) // Keep the program running
}

Les écritures simultanées sur la carte à partir de plusieurs goroutines violent les règles de concurrence de Go pour les cartes, provoquant un crash intentionnel.

Pour éviter ce crash et garantir l'intégrité des données, envisagez d'utiliser un mutex ou une primitive de synchronisation pour contrôler l'accès à la carte. Cela garantit qu'une seule goroutine peut modifier la carte à la fois.

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