Heim > Artikel > Backend-Entwicklung > Warum führt die Verwendung von „sync.WaitGroup“ mit externen Funktionen zu einem 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!