Maison > développement back-end > Golang > La fonction Append est-elle thread-safe pour une utilisation simultanée de Goroutine ?

La fonction Append est-elle thread-safe pour une utilisation simultanée de Goroutine ?

Mary-Kate Olsen
Libérer: 2024-11-18 21:53:02
original
940 Les gens l'ont consulté

Is Append Function Thread-Safe for Concurrent Goroutine Usage?

L'ajout n'est-il pas thread-safe pour une utilisation simultanée par plusieurs goroutines ?

Lors de l'utilisation de goroutines pour ajouter simultanément des données à une tranche dans une boucle , vous pouvez rencontrer des incohérences, telles que des éléments manquants ou dupliqués. Ce scénario soulève la question de savoir si la fonction append n'est pas thread-safe pour une utilisation simultanée par plusieurs goroutines.

La réponse : courses de données et manque de sécurité des threads

Dans Go, aucune valeur n'est sûre pour la lecture/écriture simultanée, y compris les tranches (ou plus précisément les en-têtes de tranche). Lorsque plusieurs goroutines tentent de modifier simultanément la même tranche, des courses de données se produisent, conduisant potentiellement à un comportement inattendu.

Vérification de la course aux données

Vous pouvez exécuter votre code avec le - option race pour confirmer la présence de courses de données :

go run -race play.go
Copier après la connexion

Solution : Synchronisation

Pour résoudre ce problème et assurer la cohérence des données, vous devez synchroniser l'accès au slice lors de l’écriture simultanée d’éléments. Ceci peut être réalisé en utilisant un sync.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()
Copier après la connexion

En acquérant le mutex avant de l'ajouter à la tranche et en le libérant par la suite, vous vous assurez qu'une seule goroutine a un accès en écriture à la fois, empêchant ainsi la corruption des données.

Conclusion

Bien que les éléments de tranche se comportent comme des variables distinctes et peuvent être modifiés simultanément, les en-têtes de tranche ne sont pas intrinsèquement thread-safe. Pour garantir des opérations d'écriture simultanées sûres et cohérentes, il est crucial d'utiliser des mécanismes de synchronisation tels que des mutex ou des canaux lors de la modification des en-têtes de tranche dans les goroutines.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal