面试真题

Go · 中等 · 百度

go怎样在并发编程下等待多个协程的结束,Add和wait的底层实现是怎样的

中等 Go 🎤 百度
参考答案
结论:用sync.WaitGroup等待多协程结束,Add增计数,Done减一,Wait阻塞至零。核心要点:内部noCopy、state1含counter、waiter、信号量;Add原子增counter;Done调Add(-1);Wait原子读counter,>0则waiter++并信号量等待。原理:state1 12字节存counter(32)、waiter(32)、sem(32);Add用atomic更新,变零释放信号量唤醒;Wait用CAS增waiter并runtime_Semacquire阻塞。注意Add在Wait前,负值不超counter。示例:wg.Add(2); go func(){defer wg.Done()}(); wg.Wait()。
题目整理自公开面经,答案由校招宝自研生成,仅供参考