Go 语言作为一种现代并发编程语言,提供了强大的并发模型和工具。其中,sync.WaitGroup
是 Go 标准库中的一个重要同步工具,广泛用于协程(goroutine)的同步控制。本文将深入探讨 sync.WaitGroup
的工作原理、应用场景以及如何避免使用共享变量和信号量来实现同步。
一、sync.WaitGroup
简介
sync.WaitGroup
是 Go 标准库 sync
包中的一个类型,主要用于同步多个协程的执行。它的核心作用是允许主程序或其他协程等待一组协程完成任务后再继续执行。
1. 结构
type WaitGroup struct {noCopy noCopy // 防止被复制state1 atomic.Uint64 // 用于原子操作的状态标志sema uint32 // 用于阻塞和唤醒
}
WaitGroup
内部通过原子操作(atomic
)和信号量(sema
)实现协程的同步。
2. 核心方法
-
Add(delta int)
增加或减少等待的任务数量(计数器)。delta > 0
:增加任务数。delta < 0
:减少任务数。
-
Done()