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

go sync Waitgroup数据结构实现基本操作详解

sema

WaitGroupsema
runtime_Semacquireruntime_Semrelease

WaitGroup 的三个基本操作

AddWaitGroupcounterAddDoneWaitGroupcounterWaitWaitGroupwaiterWaitWaitGroup

WaitGroup 的实现

Add 的实现

Add
deltastatecounter0waiterWait

源码实现:

Done 的实现

WaitGroupDoneAdd

Wait 的实现

Wait
Wait000Wait

源码实现:

总结

WaitGroupsemaruntime_Semacquire0runtime_SemreleaseWaitGroupAddDonecallerWaitWaitGroupwaiterWaitGroupAddDone1WaitWait0