Maison >développement back-end >Golang >WaitGroup.Wait() agit-il comme une barrière de mémoire dans Go ?

WaitGroup.Wait() agit-il comme une barrière de mémoire dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 11:32:02224parcourir

 Does WaitGroup.Wait() Act as a Memory Barrier in Go?

WaitGroup.Wait() garantit-il une barrière mémoire ?

Considérez l'extrait de code suivant :

var condition bool
var wg sync.WaitGroup
for _, item := range items {
    wg.Add(1)
    go func(item) {
        if meetsCondition(item) {
            condition = true
        }
        wg.Done()
    }(item)
}
wg.Wait()
// is it safe to check condition here?

Le la question se pose de savoir s'il est sûr de vérifier la variable de condition après le retour de wg.Wait(). La documentation officielle de Go ne mentionne explicitement aucune implication de barrière de mémoire, mais la documentation WaitGroup indique que Wait se bloque jusqu'à ce que le compteur du groupe d'attente atteigne zéro.

Solution

Oui, il est prudent de vérifier la variable de condition après le retour de wg.Wait(). Il existe une relation implicite qui se produit avant entre wg.Wait() et wg.Done(). Lorsqu'une goroutine appelle wg.Done(), elle garantit que toutes ses opérations terminées deviennent visibles pour les autres goroutines qui ont déjà appelé wg.Wait(). Par conséquent, wg.Wait() agit efficacement comme une barrière de mémoire, garantissant que la variable de condition est mise à jour avant la vérification après le retour de wg.Wait().

Cette relation qui se produit avant n'est pas explicitement documentée mais a été confirmé par les développeurs de Go. Reportez-vous au fil de discussion du forum Go ici pour plus de détails.

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!

Déclaration:
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