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