Maison > développement back-end > Golang > L'itération simultanée sur les cartes Go avec « plage » est-elle sûre et comment peut-on y parvenir ?

L'itération simultanée sur les cartes Go avec « plage » est-elle sûre et comment peut-on y parvenir ?

Susan Sarandon
Libérer: 2024-12-13 17:43:21
original
609 Les gens l'ont consulté

Is Concurrent Iteration Over Go Maps with `range` Safe, and How Can It Be Achieved?

Accès simultané aux cartes avec plage dans Go

Le concept d'accès simultané aux cartes à l'aide du mot-clé plage dans Go est souvent mal compris. Pour clarifier cette question, explorons les subtilités de l'accès simultané aux cartes et les implications de l'utilisation de range.

Évaluation de l'expression de plage

L'expression de plage dans une instruction for n'est évaluée qu'une seule fois avant la boucle. commence, hors certains scénarios spécifiques. Dans le cas d'une carte, l'expression range pointe simplement vers la variable map.

Itération avec Range

Lors de l'itération avec range, les variables clé et valeur (k et v dans la plupart des cas) conserver les valeurs de la carte lors de chaque itération. Cependant, l'accès à la carte ne se produit pas dans le bloc for lors de l'exécution d'une itération. Cela se produit lorsque les valeurs k et v sont définies pour l'itération suivante.

Itération simultanée sécurisée

Comprenant ces concepts, il est sûr d'effectuer une itération simultanée sur une carte en utilisant un verrou pour protéger la carte lors de l’itération. Cependant, le déverrouillage au cours de l'itération doit être effectué sous forme d'instruction différée pour gérer les retours anticipés.

var testMap = make(map[int]int)
var testMapLock = &sync.RWMutex{}

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    for k, v := range testMap {
        testMapLock.RUnlock()
        someFunc()
        testMapLock.RLock()
        if someCond {
            return someErr
        }
    }
    return nil
}
Copier après la connexion

Modifications simultanées

Il est crucial de noter que ce type de schéma de verrouillage ne protège que contre les accès simultanés. . Cela n'empêche pas les modifications simultanées par d'autres goroutines. Cependant, si les modifications sont protégées par des verrous en écriture, elles restent sûres, mais la boucle for ne parcourra pas nécessairement la nouvelle paire.

Pratiques dangereuses

Déverrouillage du verrou en lecture dans le bloc for n'est pas sûr, car il permet à d'autres goroutines de modifier la carte et potentiellement de provoquer une condition de concurrence.

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