Maison > développement back-end > Golang > Le mot-clé « range » de Go est-il sûr pour l'accès simultané à la carte ?

Le mot-clé « range » de Go est-il sûr pour l'accès simultané à la carte ?

Barbara Streisand
Libérer: 2024-12-07 04:54:16
original
554 Les gens l'ont consulté

Is Go's `range` Keyword Safe for Concurrent Map Access?

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

Dans l'entrée de blog « Go maps in action », la documentation indique que les cartes ne sont pas sûrs pour une utilisation simultanée sans mécanismes de synchronisation tels que sync.RWMutex. Cependant, il n'est pas clair si l'accès via une itération de plage constitue une « lecture » ou si le mot-clé range a des exigences de verrouillage spécifiques.

Concurrence de plage

L'expression de plage est évalué une fois avant le début de la boucle. Pour les cartes, cela signifie que la variable de carte (par exemple, testMap) n'est évaluée qu'une seule fois, même si de nouvelles paires clé-valeur peuvent être ajoutées ou supprimées au cours de l'itération. Cette séparation entre l'évaluation initiale et l'itération elle-même implique que l'instruction for n'accède pas à la carte lors de l'exécution d'une itération.

Itération sécurisée

Par conséquent, ce qui suit l'itération est sécurisée pour un accès simultané :

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    mySeq := testMapSequence
    for k, _ := range testMap {
        ....
    }
    return nil
}
Copier après la connexion

Cette conception garantit que la carte est verrouillée uniquement lorsque cela est nécessaire, tout en permettant un accès simultané à d'autres goroutines.

Modification simultanée

Cependant, ce type de verrouillage empêche uniquement l'accès simultané, pas la modification simultanée. Il est possible qu'un autre goroutine acquière le verrou en écriture et modifie la carte même pendant que l'itération est en cours. Pour éviter cela, la carte doit rester verrouillée tout au long de l'itération.

Exemple

Cet exemple montre la différence entre le déverrouillage et le verrouillage dans le bloc for :

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    mySeq := testMapSequence
    for k, _ := range testMap {
        testMapLock.RUnlock()
        ....
        testMapLock.RLock()
        ....
    }
    return nil
}
Copier après la connexion

Dans cet exemple, libérer le verrou de lecture dans le bloc for permet une modification simultanée et potentielle erreurs.

Conclusion

Le mot-clé range lui-même ne fournit pas de synchronisation pour l'accès simultané aux cartes. L'utilisation de mécanismes de synchronisation appropriés (par exemple, sync.RWMutex) est cruciale pour garantir la sécurité des itérations et des modifications simultanées.

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