[GO]sync.WaitGroup作用及使用

sync.WaitGroup是被设计用来实现同步问题的一个函数。

WaitGroup维护一个计数器,初始为0。

它有三个方法来对计数器进行操作或判断:Add(), Done(), Wait()

1.Add(n) 把计数器设置为n

2.Done() 每次把计数器-1

3.wait() 会阻塞代码的运行,直到计数器地值减为0。

给出雨痕大佬的例子:

func main() {
    wg := new(sync.WaitGroup)     
    wg.Add(2)
    go func() {
      defer wg.Done()         
      for i := 0; i < 6; i++ {
            println(i)
            if i == 3 { 
              runtime.Gosched() 
            }         
        }
    }()
    go func() {
      defer wg.Done()         
      println("Hello, World!")     
    }()
    wg.Wait() 
}

这里的运行结果如下:

0
1
2
3
Hello, World!
4
5

其中runtime.Gosched()函数的作用是退出当前的go协程,将其暂时挂起等待下次调用。

函数将会先设置计数器为2,进入第一个匿名函数,循环4次后触发Goshced函数挂起当前函数,进入下一个匿名函数,打印Hello,world后触发defer wg.Done(),将计数器-1,此时调用Wait()函数,由于计数器不为0,进入挂起函数,继续打印45,之后触发defer wg.Done(),退出匿名函数后,满足Wait()条件,退出。

     
上一篇:Java多线程(三)——线程安全


下一篇:docker的网络模式