Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-11-06 00:50:02786parcourir

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>

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>

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!

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