Maison > développement back-end > Golang > Pourquoi l'utilisation de « sync.WaitGroup » avec des fonctions externes entraîne-t-elle une impasse ?

Pourquoi l'utilisation de « sync.WaitGroup » avec des fonctions externes entraîne-t-elle une impasse ?

Linda Hamilton
Libérer: 2024-11-06 00:50:02
original
874 Les gens l'ont consulté

Why does using `sync.WaitGroup` with external functions lead to a deadlock?

Bonne pratique pour utiliser sync.WaitGroup avec des fonctions externes

Dans l'extrait de code fourni, vous rencontrez un blocage lorsque vous tentez d'utiliser une synchronisation .WaitGroup avec une fonction externe. L'erreur provient du passage incorrect d'une copie du WaitGroup à la fonction externe, ce qui entraîne que la méthode Done() n'est pas invoquée sur le WaitGroup prévu.

Pour résoudre ce problème, assurez-vous de transmettre un pointeur vers le WaitGroup prévu. WaitGroup à la place. Ce faisant, la fonction externe peut accéder au WaitGroup correct et appeler Done() de manière appropriée. Voici le code corrigé :

<code class="go">package main

import (
    "fmt"
    "sync"
)

func main() {
    ch := make(chan int)

    var wg sync.WaitGroup
    wg.Add(2)

    go Print(ch, &wg) // Pass a pointer to the WaitGroup

    go func() {
        for i := 1; i <= 11; i++ {
            ch <- i
        }
        close(ch)
        defer wg.Done()
    }()

    wg.Wait() // Wait for both goroutines to finish
}

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}</code>
Copier après la connexion

Alternativement, vous pouvez modifier la signature de la fonction Print pour supprimer le paramètre WaitGroup, comme indiqué ci-dessous :

<code class="go">func Print(ch <-chan int) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
}</code>
Copier après la connexion

Dans ce cas, le Print La fonction est chargée de fermer le WaitGroup une fois l'opération terminée. Cette approche est préférable dans les scénarios où la fonction externe ne nécessite pas d'accès direct au WaitGroup.

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