一、介绍
WaitGroup是多个goroutine之间协作的一种实现方式,主要功能就是阻塞等待一组goroutine执行完成。
常用的使用场景:主goroutine调用Add函数设置需要等待的goroutine的数量,当每个goroutine执行完成后调用Done函数(将counter减1),Wait函数用于阻塞等待直到该组中的所有goroutine都执行完成。
源码中主要设计到的三个概念:counter、waiter和semaphore
counter: 当前还未执行结束的goroutine计数器
waiter : 等待goroutine-group结束的goroutine数量,即有多少个等候者
semaphore: 信号量
信号量是Unix系统提供的一种保护共享资源的机制,用于防止多个线程同时访问某个资源。
可简单理解为信号量为一个数值:
当信号量>0时,表示资源可用,获取信号量时系统自动将信号量减1;
当信号量=0时,表示资源暂不可用,获取信号量时,当前线程会进入睡眠,当信号量为正时被唤醒。
二、源码分析
Golang源码版本 :1.10.3
1.结构体
type WaitGroup struct {
noCopy noCopy //该WaitGroup对象不允许拷贝使用,只能用指针传递
// 64-bit value: high 32 bits are counter, low 32 bits are waiter count.
// 64-bit atomic operations require 64-bit alignment, but 32-bit
// compilers do not ensure it. So we allocate 12 bytes and then use
// the aligned 8 bytes in them as state.
//用于存储计数器(counter)和waiter的值
// 只需要64位,即8个字节,其中高32位是counter值,低32位值是waiter值
// 不直接使用uint64,是因为uint64的原子操作需要64位系统,而32位系统下,可能会出现崩溃
// 所以这里用byte数组来实现,32位系统下4

最低0.47元/天 解锁文章
431

被折叠的 条评论
为什么被折叠?



