golang中sync.WaitGroup的使用

WaitGroup是經常使用的同步阻塞等待對象。WaitGroup能夠調度goroutinue。首先調用同步等待組的Add(num)其中num爲正整數,num會添加到WaitGroup中的counter數據裏, 而後再協程內部調用Done() ,Done() 方法調用的是Add(-1),counter值會減小,全部執行wg.Wait()的goroutinue在counter不等於0時都會被堵塞。等於0時那些goroutinue再也不阻塞
代碼以下。下面的代碼中有兩個執行wg.Wait()的goroutinue。golang

func main() {
    var wg = sync.WaitGroup{}
    wg.Add(1)
    go func() {
        wg.Done()
    }()
    go func() {
        wg.Wait()
        fmt.Println("Hi1")
    }()
    wg.Wait()
    fmt.Println("Hi2")
}

可是由於goroutinue調度緣由上面的代碼的輸出不惟一順序和數量均可能不同。具體緣由能夠查看golang中GMP的調度。code