Im bereitgestellten Code werden zwei Funktionen eingeführt: concurrentStruct() und concurrentStructWithMuLock (). Beide Funktionen lesen und schreiben gleichzeitig eine Struktur, erstere tut dies jedoch ohne Sperren und generiert Race-Warnungen. Umgekehrt verwendet Letzteres einen Lese-/Schreib-Mutex, um den Zugriff zu synchronisieren, was zu keinen Race-Warnungen führt.
Wie aus den Fehlermeldungen hervorgeht, tritt ein Datenrennen auf, wenn:
In concurrentStruct() entsteht diese Situation, weil auf das Schlüsselfeld der Metadatenstruktur von mehreren Goroutinen ohne Synchronisierung zugegriffen und dieses geändert wird.
Während concurrentStruct() keine Sperren verwendet, führt die Verwendung anonymer Goroutinen, die auf unbestimmte Zeit laufen, zu potenziellen Wettlaufbedingungen. Diese Goroutinen lesen, ändern und schreiben kontinuierlich das Schlüsselfeld, ohne die Aktionen anderer Goroutinen zu berücksichtigen.
Im Gegensatz zu concurrentStruct() verwendet concurrentStructWithMuLock() einen Lesevorgang -Mutex schreiben, um den Zugriff auf das Schlüsselfeld zu synchronisieren. Dies stellt einen gegenseitigen Ausschluss sicher und verhindert, dass mehrere Goroutinen gleichzeitig das Feld ändern. Infolgedessen treten keine Race Conditions auf und die Funktion wird ohne Warnungen ausgeführt.
Die Funktion concurrentMap() zeigt eine andere Art von Race Condition bei einer Go-Map . Während Maps in Go threadsicher sind, kann der gleichzeitige Zugriff auf die Map sowohl beim Lesen als auch beim Schreiben ohne ordnungsgemäße Synchronisierung zu schwerwiegenden Fehlern führen. Die Laufzeit von Go umfasst einen einfachen Datenwettlauf-Detektor, der das Programm zum Absturz bringt, wenn es einen solchen unsynchronisierten Zugriff auf Karten erkennt, als Schutz vor undefiniertem Verhalten.
Das obige ist der detaillierte Inhalt vonWie können gleichzeitige Lese- und Schreibvorgänge für Go-Strukturen sicher implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!