Golang Sync.WaitGroup 使用及原理

本文详细介绍了Golang中Sync.WaitGroup的使用和实现原理,包括Add、Done和Wait方法的工作流程。WaitGroup通过原子操作维护计数器,确保并发安全。当计数器为0时,释放等待的goroutine,实现同步。此外,文章还讨论了WaitGroup的数据结构及其避免复制的技巧。
摘要由CSDN通过智能技术生成

Golang Sync.WaitGroup 使用及原理

使用

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 到底是什么数据结构

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

nocopy 避免这个结构体被复制的一个技巧,可以告诉go vet工具违反了复制使用的规则
state1 [3]uint32 字段中包含了 waitgroup 的所有状态信息, 根据标准库上自带的注释简单翻译是:state1 由 12 个字节组成,其中将8字节看作64位值,其中高32位存放的是 counter 计数器, 代表目前还未完成的 goroutine个数,低32位存放的是 waiter 计数器, 可以理解成下面这个结构体

type WaitGroup struct {
   
	// 代表目前尚未完成的个数
	// WaitGroup.Add(n) 将会导致 counter += n
	// WaitGroup.Done() 将导致 counter--
	counter uint32

	// 目前已调用 WaitGroup.Wait 的 goroutine 的个数
	waiter  uint32

	// 对应于 golang 中 runtime 内部的信号量
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值