什么是使用golang sync.WaitGroup

时间:2016-12-06 20:28:22

标签: multithreading go synchronization

golang doc中所述,sync是低级库例程的意图。

  

除了Once和WaitGroup类型之外,大多数都是打算使用的   低级库例程。更高级别的同步更好   通过渠道和沟通完成。

我不太了解这个陈述,我使用同步,如下例所示 我的目的只是让主线程等到所有其他线程完成,类似于c ++线程库中的.join()

问题:
1:这样使用同步是否合适?或者我应该使用频道而不是同步?
2:频道和同步有什么区别?

var wg sync.WaitGroup      // declare the variable globally

func send(a string, b string){
    defer wg.Done()
    // do something
}
func main(){
    for i:=0; i<50; i++ {
         wg.Add(1)              // add delta
         go send("1111", "2222")
    }
    wg.Wait()                  // wait until wg becomes 0
}

任何建议都表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:0)

此示例可以帮助您

var wg sync.WaitGroup
done := make(chan bool)

for _, element := range slice {
    wg.Add(1)
    go func(elem interface{}) {
        wg.Done()
    }(element)
}

go func() {
    wg.Wait()
    done <- true
}()

for {
    select {
    case done:
        fmt.Println("All goroutines completed")
        close(done)
        return
    case time.After(time.Minute * 2):
        fmt.Println("Timeout!")
        return
    }
}

答案 1 :(得分:0)

我不知道它是否合适,但下面的代码可以在不使用较低级别“同步”的情况下完成。

package main

func send(a string, b string, c chan bool) {
//  println( a, b )
    c <- true;
}

func
main() {

    c := make( chan bool )

    for i:=0; i<50; i++ {
        go send("1111", "2222", c)
    }

    w := 0
    for _ = range c {
        w += 1
        if w == 50 { break }
    }

}