Maison >développement back-end >Golang >L'accès simultané à Go Maps est-il sécurisé pendant l'itération « plage » ?

L'accès simultané à Go Maps est-il sécurisé pendant l'itération « plage » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-14 10:02:10738parcourir

Is Concurrent Access to Go Maps Safe During `range` Iteration?

Accès simultané aux cartes avec « plage » dans Go

L'entrée du blog Go sur « Maps en action » souligne l'importance de la synchronisation lorsque accéder aux cartes simultanément. Cependant, il reste difficile de savoir si l'itération sur les cartes à l'aide du mot-clé range constitue une phase de « lecture » ou de « retournement », et si un accès simultané est autorisé au cours de ce processus.

L'expression de plage dans une boucle for est évaluée une fois avant le début de la boucle. Cela signifie que la valeur de la carte n'est accessible qu'une seule fois et que toute modification ultérieure apportée à la carte ne sera pas reflétée dans l'itération. En tant que tel, l'accès simultané est sûr tant que la carte elle-même n'est pas modifiée lors de l'itération dessus.

Pour garantir la sécurité des threads, la carte doit être verrouillée en lecture avant d'entrer dans la boucle et déverrouillée après chaque itération. Cela empêche les goroutines concurrentes de modifier la carte pendant ce temps. Le code ci-dessous démontre cette technique :

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
}

Modifier la carte dans une goroutine différente tout en maintenant un verrou en écriture garantit la modification sûre et l'observation ultérieure des changements par l'itérateur de boucle.

Cependant, il est crucial de noter que ce mécanisme de verrouillage empêche uniquement les accès simultanés, et non les modifications simultanées. Des modifications simultanées peuvent toujours survenir, mais elles n'affecteront pas l'itération en cours.

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