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