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

Pourquoi le passage d'une structure WaitGroup par valeur provoque-t-il un blocage dans la communication du canal Go ?

Patricia Arquette
Libérer: 2024-10-29 07:47:02
original
393 Les gens l'ont consulté

Why Does Passing a WaitGroup Structure by Value Cause a Deadlock in Go Channel Communication?

Interblocage dans la communication du canal Go en raison du passage de la structure par valeur

Dans votre code, vous avez rencontré une erreur de blocage dans votre canal goroutine communication. Cette erreur est due au fait que vous transmettez une structure WaitGroup par valeur à vos goroutines, ce qui crée une copie du WaitGroup au lieu de partager la référence d'origine.

Pourquoi le passage par valeur provoque un blocage

Les structures dans Go sont transmises par valeur, pas par référence. Lorsque vous transmettez une structure à une fonction, une copie est créée et transmise à la fonction. Cela signifie que toute modification apportée à la structure au sein de la fonction ne sera pas reflétée dans la structure d'origine en dehors de la fonction.

Dans votre cas, les goroutines essaient de signaler au WaitGroup lorsqu'ils terminent leurs tâches. Cependant, comme ils utilisent une copie du WaitGroup, leurs appels Done() n'affectent pas le WaitGroup d'origine. Par conséquent, l'appel Wait() dans la goroutine principale ne se termine jamais, ce qui entraîne un blocage.

Solution : passer par le pointeur

Pour résoudre ce problème, vous vous devez transmettre le WaitGroup à vos goroutines par pointeur. Cela garantit que les goroutines et la goroutine principale partagent la même référence au WaitGroup.

Exemple de travail :

Voici une version corrigée de votre code :

<code class="go">package main

import (
    "fmt"
    "sync"
)

func push(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        c <- i
    }
    wg.Done()
}

func pull(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        result, ok := <-c
        fmt.Println(result, ok)
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    c := make(chan int)

    go push(c, &wg)
    go pull(c, &wg)

    wg.Wait()
}</code>
Copier après la connexion

Maintenant, lorsque vous exécutez ce code, vous ne devriez plus rencontrer l'erreur de blocage. Les goroutines signaleront avec succès le WaitGroup et la goroutine principale pourra terminer son exécution.

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