Wie vermeide ich Deadlocks bei Verwendung von sync.WaitGroup mit einer externen Funktion?

Mary-Kate Olsen
Freigeben: 2024-11-06 05:06:02
Original
592 Leute haben es durchsucht

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

Optimale Nutzung von sync.WaitGroup mit externen Funktionen

Problem:

Synchronisierung wird implementiert. WaitGroup mit einer externen Funktion verursacht einen Deadlock beim Versuch, die Zahlen 1 bis 11 zu drucken. Konkret tritt der Fehler in der Zeile wg.Wait() auf.

Lösung 1 (falscher Ansatz):

Das Setzen von wg.Add(1) anstelle von 2 ist eine falsche Lösung, da es das grundlegende Problem nicht behebt.

Lösung 2 (verbesserter Ansatz):

Ändern Sie den Code wie folgt:

  • Übergeben Sie in der Hauptfunktion die Adresse der sync.WaitGroup mit &wg an die Print-Funktion.
  • Entfernen Sie die wg Parameter aus der Print-Funktionssignatur.
<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)

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

    wg.Wait() //deadlock here
}                

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // reads from channel until it's closed
        fmt.Println(n)
    }            
    wg.Done()
}</code>
Nach dem Login kopieren

Erklärung:

Durch die Übergabe der Adresse von wg an Print wird sichergestellt, dass dieselbe WaitGroup-Instanz manipuliert wird. Durch das Entfernen von wg aus der Signatur der Druckfunktion ist es nicht mehr erforderlich, dass die Funktion etwas über die externe WaitGroup weiß.

Schlussfolgerung:

Die zweite Lösung ist ein robusterer Ansatz, der vermeidet blockiert Deadlocks und behält die Unabhängigkeit der Print-Funktion von wg bei.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Deadlocks bei Verwendung von sync.WaitGroup mit einer externen Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!