Golang中WaitGroup如何实现并发同步及其工作原理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1624个文字,预计阅读时间需要7分钟。
Golang 中的 `sync.WaitGroup` 是一个用于等待一组协程(goroutine)完成的同步原语。下面是使用 `sync.WaitGroup` 的简化示例:
gopackage main
import (fmtsync)
func main() {var wg sync.WaitGroup
for i :=0; i <10; i++ {wg.Add(1)go func() {defer wg.Done()fmt.Println(Hello WaitGroup!)}()}wg.Wait()}
在这个示例中,`WaitGroup` 是一个数据结构,包含三个主要的操作:
1. `Add(int)`:增加计数器的值。
2.`Done()`:将计数器的值减一,如果计数器变为零,则通知所有等待的 `Wait()` 调用者。
3.`Wait()`:阻塞当前goroutine,直到计数器变为零。
`WaitGroup` 实际上是一个 `sync.WaitGroup` 结构体,其定义如下:
go
type WaitGroup struct {n int // n is the number of goroutines that have called Add. It is negative if Wait has been called more times than Add.mu sync.Mutexsema uint32}在这里,`n` 是 `WaitGroup` 的核心字段,表示等待的goroutine数量。当 `n` 为零时,表示所有goroutine都已完成,`Wait()` 可以返回。
本文共计1624个文字,预计阅读时间需要7分钟。
Golang 中的 `sync.WaitGroup` 是一个用于等待一组协程(goroutine)完成的同步原语。下面是使用 `sync.WaitGroup` 的简化示例:
gopackage main
import (fmtsync)
func main() {var wg sync.WaitGroup
for i :=0; i <10; i++ {wg.Add(1)go func() {defer wg.Done()fmt.Println(Hello WaitGroup!)}()}wg.Wait()}
在这个示例中,`WaitGroup` 是一个数据结构,包含三个主要的操作:
1. `Add(int)`:增加计数器的值。
2.`Done()`:将计数器的值减一,如果计数器变为零,则通知所有等待的 `Wait()` 调用者。
3.`Wait()`:阻塞当前goroutine,直到计数器变为零。
`WaitGroup` 实际上是一个 `sync.WaitGroup` 结构体,其定义如下:
go
type WaitGroup struct {n int // n is the number of goroutines that have called Add. It is negative if Wait has been called more times than Add.mu sync.Mutexsema uint32}在这里,`n` 是 `WaitGroup` 的核心字段,表示等待的goroutine数量。当 `n` 为零时,表示所有goroutine都已完成,`Wait()` 可以返回。

