WaitGroup 示例
本文基于 Go 1.19。
WaitGroup
下面的代码展示了一个 goroutine 等待另外 2 个 goroutine 结束的例子:
在这个例子中,我们做了如下事情:
WaitGroupwgwg.Add(2)+2sendHttpRequestwg.Done-1wg.WaitWaitGroup
WaitGroup 基本原理
WaitGroupAddDoneWaitWaitWaitGroup
背景知识
test_and_setcompare_and_swap
信号量
wait()signal()wait()Pproberensignal()Vverhogenwait()
PV 原语。
signal()
wait()signal()
简单来说,信号量实现的功能是:
wait
WaitGroup 中的信号量
WaitGroup
WaitDoneWaitGroup
WaitGroup 数据结构
noCopy
WaitGroupnoCopygo vetWaitGroupWaitGroup
WaitGroup
testwg.Done()WaitGroupTestWaitGroupWaitGroupWait
WaitGroup
testwg.Done()TestWaitGroupWaitGroupWait
state
WaitGroupstateatomic.Uint64counterwaiterWait
sema
WaitGroupsema
runtime_Semacquireruntime_Semrelease
WaitGroup 的三个基本操作
AddWaitGroupcounterAddDoneWaitGroupcounterWaitWaitGroupwaiterWaitWaitGroup
WaitGroup 的实现
Add 的实现
Add
deltastatecounter0waiterWait
源码实现:
Done 的实现
WaitGroupDoneAdd
Wait 的实现
Wait
Wait000Wait
源码实现:
总结
WaitGroupsemaruntime_Semacquire0runtime_SemreleaseWaitGroupAddDonecallerWaitWaitGroupwaiterWaitGroupAddDone1WaitWait0