携手创造,一起成长!这是我参加「日新计划 8 月更文应战」的第30天,点击检查活动概况

sync.WaitGroup结构体目标

在Go言语中,sync.WaitGroup结构体目标用于等候一组线程的结束;WaitGroup是go并发中最常用的东西,咱们可以经过WaitGroup来表达这一组协程的任务是否完结,以决定是否持续往下走,或许取任务结果;

WaitGroup的结构体

结构如下所示:

type WaitGroup struct {
    noCopy noCopy 
    state1 [3]uint32 
}

在sync.WaitGroup结构体目标中有三个办法,Add()、Done()、Wait()

Add()办法

首要为WaitGroup的等候数+1或许+n;

Add()办法的界说如下:

func(*WaitGroup) Add()
  • Add()办法内部计数器加上delta,delta可以是负数;
  • 假如内部计数器变为0,则Wait()办法会将处于堵塞等候的所有goroutine开释;
  • 假如计数器小于0,则调用panic()函数;
  • Add()办法加上正数的调用应在Wait()办法之前,否则Wait()办法可能只会等候很少的goroutine;
  • Add()办法在创建新的goroutine或许其它等候的事情之前调用;

Done()办法

Done函数调用的也是Add函数,首要用于-1操作;

Done()办法的界说如下:

func(wg *WaitGroup) Done()
  • Done()办法会削减WaitGroup计数器的值,一般在goroutine的最终履行;

Wait()办法

堵塞当前协程,直到等候数归为0才持续向下履行;

Wait()办法的界说如下:

func (wg *WaitGroup) Wait()

Wait()办法会堵塞,知道WaitGroup计数器减为0.

Add()、Done()、Wait()三者对比

  • 在三个办法中,运用Add()办法增加计数,运用Done()办法减掉一个计数,假如计数不为0,则会堵塞Wait()办法的运转;
  • 一个goroutine调用Add()办法来设定等候的goroutine的数量;
  • 每个被等候的goroutine在结束时调用Done()办法;
  • 在主goroutine里可以调用Wait()办法堵塞至所有goroutine结束;

sync.WaitGroup运用示例

运用sync.WaitGroup等候goroutine结束的示例如下图所示:

Go言语同步等候组sync.WaitGroup 结构体目标