Am besten Weg mit sync.WaitGroup mit externen Funktion

Ich habe einige Probleme mit dem folgenden code:

package main

import (
"fmt"
"sync"
)
//This program should go to 11, but sometimes it only prints 1 to 10.
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) 
        defer wg.Done()


    }()

    wg.Wait() //deadlock here
}

//Print prints all numbers sent on the channel.
//The function returns when the channel is closed.
func Print(ch <-chan int, wg sync.WaitGroup) {
    for n := range ch { //reads from channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}

Bekomme ich einen deadlock an der angegebenen Stelle. Ich habe versucht Einstellung wg.Add(1) anstatt 2 und es löst mein problem. Meine überzeugung ist, dass ich nicht erfolgreich, sendet der Kanal als argument für die Printer Funktion. Gibt es eine Möglichkeit, das zu tun? Sonst eine Lösung zu meinem problem ist das ersetzen der go Print(ch, wg)Zeile mit:

go func() {
Print(ch)
defer wg.Done()
}

und die änderung der Printer Funktion:

func Print(ch <-chan int) {
    for n := range ch { //reads from channel until it's closed
        fmt.Println(n)
    }

}

Was ist die beste Lösung?

  • aus golang.org/pkg/sync er stellt fest: "Werte mit den Typen in diesem Paket sollte nicht kopiert werden" Also, pass nur sync.WaitGroup durch pointer-Referenz.
InformationsquelleAutor Sahand | 2016-04-04
Schreibe einen Kommentar