Gleichzeitiger Zugriff auf Karten mit „Bereich“ in Go
Im Blogeintrag „Go-Karten in Aktion“ heißt es in der Dokumentation, dass Karten sind für die gleichzeitige Verwendung ohne Synchronisierungsmechanismen wie sync.RWMutex nicht sicher. Es ist jedoch nicht klar, ob der Zugriff über die Bereichsiteration einen „Lesevorgang“ darstellt oder ob für das Bereichsschlüsselwort bestimmte Sperranforderungen gelten.
Parallelität des Bereichs
Der Bereichsausdruck ist einmal ausgewertet, bevor die Schleife beginnt. Für Karten bedeutet dies, dass die Kartenvariable (z. B. testMap) nur einmal ausgewertet wird, auch wenn während der Iteration möglicherweise neue Schlüssel-Wert-Paare hinzugefügt oder entfernt werden. Diese Trennung zwischen der anfänglichen Auswertung und der Iteration selbst impliziert, dass während der Ausführung einer Iteration nicht durch die for-Anweisung auf die Karte zugegriffen wird.
Sichere Iteration
Daher Folgendes Die Iteration ist sicher für gleichzeitigen Zugriff:
func IterateMapKeys(iteratorChannel chan int) error { testMapLock.RLock() defer testMapLock.RUnlock() mySeq := testMapSequence for k, _ := range testMap { .... } return nil }
Dieses Design stellt sicher, dass die Karte nur bei Bedarf gesperrt wird, während gleichzeitiger Zugriff auf andere möglich ist Goroutinen.
Gleichzeitige Änderung
Diese Art der Sperre verhindert jedoch nur den gleichzeitigen Zugriff, nicht die gleichzeitige Änderung. Es ist möglich, dass eine andere Goroutine die Schreibsperre erhält und die Karte ändert, selbst während die Iteration läuft. Um dies zu verhindern, sollte die Karte während der gesamten Iteration gesperrt bleiben.
Beispiel
Dieses Beispiel zeigt den Unterschied zwischen Entsperren und Sperren innerhalb des for-Blocks:
func IterateMapKeys(iteratorChannel chan int) error { testMapLock.RLock() defer testMapLock.RUnlock() mySeq := testMapSequence for k, _ := range testMap { testMapLock.RUnlock() .... testMapLock.RLock() .... } return nil }
In diesem Beispiel ermöglicht das Aufheben der Lesesperre innerhalb des for-Blocks gleichzeitige Änderungen und Potenziale Fehler.
Fazit
Das Bereichsschlüsselwort selbst bietet keine Synchronisierung für den gleichzeitigen Zugriff auf Karten. Die Verwendung geeigneter Synchronisierungsmechanismen (z. B. sync.RWMutex) ist entscheidend, um die Sicherheit gleichzeitiger Iterationen und Änderungen zu gewährleisten.
Das obige ist der detaillierte Inhalt vonIst das Schlüsselwort „range' von Go für den gleichzeitigen Kartenzugriff sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!