Heim  >  Artikel  >  Backend-Entwicklung  >  Ist Append in Go bei Verwendung mit Goroutinen threadsicher?

Ist Append in Go bei Verwendung mit Goroutinen threadsicher?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 07:53:02489Durchsuche

Is Append in Go Thread-Safe When Used with Goroutines?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn