Ist Append wirklich Thread-sicher?
Synchronisierung ist entscheidend, wenn es um den gleichzeitigen Zugriff auf gemeinsam genutzte Ressourcen in Go geht. Eine gängige Praxis besteht darin, mithilfe von Goroutinen Elemente an ein Slice anzuhängen. Allerdings ist die Append-Funktion nicht von Natur aus Thread-sicher.
Im beschriebenen Fall kann das Erstellen separater Goroutinen innerhalb einer Schleife zum Anhängen an ein Slice zu Dateninkonsistenzen führen. Dies liegt daran, dass mehrere Goroutinen, die gleichzeitig in dasselbe Slice schreiben, zu Datenrennen führen können.
Um dies zu veranschaulichen, betrachten Sie den folgenden Codeausschnitt:
destSlice := make([]myClass, 0) var wg sync.WaitGroup for _, myObject := range sourceSlice { wg.Add(1) go func(closureMyObject myClass) { defer wg.Done() var tmpObj myClass tmpObj.AttributeName = closureMyObject.AttributeName destSlice = append(destSlice, tmpObj) }(myObject) } wg.Wait()
Führen Sie diesen Code mit der Option -race aus wird mehrere Datenrennen enthüllen. Um diese Wettläufe zu verhindern, muss ein Synchronisationsmechanismus wie ein Mutex eingesetzt werden. Hier ist ein überarbeiteter Codeausschnitt mit einem Mutex:
var ( mu = &sync.Mutex{} destSlice = make([]myClass, 0) ) var wg sync.WaitGroup for _, myObject := range sourceSlice { wg.Add(1) go func(closureMyObject myClass) { defer wg.Done() var tmpObj myClass tmpObj.AttributeName = closureMyObject.AttributeName mu.Lock() destSlice = append(destSlice, tmpObj) mu.Unlock() }(myObject) } wg.Wait()
Eine alternative Lösung besteht darin, einen Kanal zu verwenden, in den Goroutinen die anzuhängenden Werte senden. Eine dedizierte Goroutine kann den Empfang dieser Werte verarbeiten und den Anhängevorgang ausführen.
Zusammenfassend lässt sich sagen, dass Slice-Elemente zwar unterschiedliche Variablen sind und gleichzeitig ohne Synchronisierung auf sie zugegriffen werden können, Slice-Header jedoch eine Synchronisierung erfordern, um Datenrennen bei gleichzeitigen Anhängevorgängen zu verhindern.
Das obige ist der detaillierte Inhalt vonIst Append in Go bei Verwendung mit Goroutinen threadsicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!