Maison > développement back-end > Golang > le corps du texte

L'ajout dans Go Thread-Safe est-il utilisé avec des Goroutines ?

Linda Hamilton
Libérer: 2024-11-11 07:53:02
original
532 Les gens l'ont consulté

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

Append est-il vraiment thread-safe ?

La synchronisation est cruciale lorsqu'il s'agit d'un accès simultané à des ressources partagées dans Go. Une pratique courante consiste à ajouter des éléments à une tranche à l'aide de goroutines. Cependant, la fonction append n'est pas intrinsèquement thread-safe.

Dans le cas décrit, la création de goroutines distinctes dans une boucle à ajouter à une tranche peut entraîner des incohérences de données. En effet, plusieurs goroutines écrivant simultanément sur la même tranche peuvent entraîner des courses de données.

Pour démontrer cela, considérons l'extrait de code suivant :

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()
Copier après la connexion

Exécuter ce code avec l'option -race révélera plusieurs courses de données. Pour empêcher ces courses, un mécanisme de synchronisation tel qu'un mutex doit être utilisé. Voici un extrait de code révisé utilisant un 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

Une solution alternative consiste à utiliser un canal dans lequel les goroutines envoient les valeurs à ajouter. Une goroutine dédiée peut gérer la réception de ces valeurs et effectuer l'opération d'ajout.

En résumé, alors que les éléments de tranche sont des variables distinctes et peuvent être consultés simultanément sans synchronisation, les en-têtes de tranche nécessitent une synchronisation pour éviter les courses de données lors d'opérations d'ajout simultanées.

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