go sync.WaitGroup 源码解析

本文详细探讨了Go语言中的sync.WaitGroup,包括其功能、结构体组成以及关键方法如Add、Done和Wait的工作原理。WaitGroup用于等待一组并发执行的goroutines完成,通过Add设置初始计数,Done减少计数,而Wait则在计数为零时释放等待。

一、什么是WaitGroup?

WaitGroup等待一组goroutines完成。

主goroutine调用Add来设置要等待的goroutine的数量。然后每个goroutines运行并在完成时调用Done。同时,Wait可以用来阻塞,直到所有goroutines完成。
WaitGroup在第一次使用后不能被复制。

二、WaitGroup 结构体

type WaitGroup struct {
	noCopy noCopy

	state1 [3]uint32
}

noCopy:防止复制

state1:这里包含3个含义,在32/64位编译器中有不同的处理方式(WaitGroup.state())

        count:计数器

        waiter:等待goroutine数量

        sema:信号量

三、方法解析:

1.state - 解析WaitGroup.state1

func (wg *WaitGroup) state() (statep *uint64, semap *uint32) {
	if uintptr(unsafe.Pointer(&wg.state1))%8 == 0 {//64位编译器
		return (*uint64)(unsafe.Pointer(&wg.state1)), &wg.state1[2]
	} else { //32位编译器
		return (*uint64)(unsafe.Pointer(&wg.state1[
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值