WaitGroup用法

1 Add()用来设置要等待的goroutine的数量,不能为负,Done()用来表示goroutine已经完成了,减少一次计数器,Wait()用来等待所有需要等待的goroutine完成。特别注意这个传递的时候要传指针,传值的话是错误的,

package main
import (
    "fmt"
    "sync"
    "time"
)
// 这里的接收参数必须是指针,因为三个goroutine要共用一个计数器,
// 如果不是指针,每个goroutine都会拷贝一份, 这样会造成死锁,
func process(i int, wg *sync.WaitGroup) {
    fmt.Println("started Goroutine ", i)
    time.Sleep(2 * time.Second)
    fmt.Printf("Goroutine %d ended\n", i)
    wg.Done()
}
func main() {
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        // 添加要监控的goroutine的个数,
        wg.Add(1)
        go process(i, &wg)
    }
    // 若wg中监控的goroutine个数不为0,则会阻塞当前goroutine,
    wg.Wait()
    fmt.Println("All go routines finished executing")
}
View Code

参考: https://www.cnblogs.com/f-ck-need-u/p/10004787.html

posted on 2021-01-01 12:09  吃我一枪  阅读(352)  评论(0编辑  收藏  举报

导航