Skip to main content

WaitGroup

什么是WaitGroup

在Go中,WaitGroup可以用于等待一组Goroutine最终同时完成任务,是一种并发编程中的同步机制。有点类似屏障的概念。

(屏障:从名字就可以形象的比作一个屏障,在并发编程中,通过设置一道屏障,要求所有任务在某个点汇聚)

实现原理

等待组底层实现原理是基于计数器和信号量实现的。

技术期使用的uint64无符号整数类型,其中高32位用于存储计数器,低32位用于存储等待协程的数量。

当我们使用Add函数增加计数的时候,计数器会同步增加。

当我使用Wait函数的时候,会阻塞直至信号量通知释放。

当我们使用Done的时候,本质上就是调用了Add(-1),当计数器位0的时候,会循环遍历waiters数量,释放信号。

type WaitGroup struct {
state atomic.Uint64 // high 32 bits are counter, low 32 bits are waiter count.
sema uint32
}