Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Verwendung von „sync.WaitGroup“ mit externen Funktionen zu einem Deadlock?

Warum führt die Verwendung von „sync.WaitGroup“ mit externen Funktionen zu einem Deadlock?

Linda Hamilton
Linda HamiltonOriginal
2024-11-06 00:50:02786Durchsuche

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

Best Practice für die Verwendung von sync.WaitGroup mit externen Funktionen

Im bereitgestellten Codeausschnitt stoßen Sie auf einen Deadlock, wenn Sie versuchen, eine Synchronisierung zu verwenden .WaitGroup mit einer externen Funktion. Der Fehler ist darauf zurückzuführen, dass fälschlicherweise eine Kopie der WaitGroup an die externe Funktion übergeben wurde, was dazu führte, dass die Done()-Methode nicht für die vorgesehene WaitGroup aufgerufen wurde.

Um dieses Problem zu beheben, stellen Sie sicher, dass Sie einen Zeiger auf die übergeben Stattdessen WaitGroup. Auf diese Weise kann die externe Funktion auf die richtige WaitGroup zugreifen und Done() entsprechend aufrufen. Hier ist der korrigierte Code:

<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>

Alternativ können Sie die Signatur der Print-Funktion ändern, um den WaitGroup-Parameter zu entfernen, wie unten gezeigt:

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

In diesem Fall der Print Die Funktion ist dafür verantwortlich, die WaitGroup zu schließen, wenn sie fertig ist. Dieser Ansatz ist in Szenarien vorzuziehen, in denen die externe Funktion keinen direkten Zugriff auf die WaitGroup erfordert.

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von „sync.WaitGroup“ mit externen Funktionen zu einem Deadlock?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn