go
runtime_error
ai_generated
true
panic:sync:WaitGroup 在上一次 Wait 返回前被重用
panic: sync: WaitGroup is reused before previous Wait has returned
ID: go/panic-waitgroup-misuse-add-inside-goroutine
80%修复率
88%置信度
0证据数
2024-08-22首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.0+ | active | — | — | — |
根因分析
在 wg.Wait 返回后又调用 wg.Add,或 Add 在 goroutine 内与 Wait 竞态调用。
English
wg.Add is called after wg.Wait has returned, or Add is called inside a goroutine racing with Wait.
解决方案
-
95% 成功率
wg.Add(len(items)) for _, it := range items { go func(x Item) { defer wg.Done(); process(x) }(it) } wg.Wait() -
93% 成功率
g := new(errgroup.Group) for _, it := range items { it := it g.Go(func() error { return process(it) }) } return g.Wait()
无效尝试
常见但无效的做法:
-
90% 失败
Races with Wait; Wait may observe zero counter and return early.
-
85% 失败
WaitGroup is not designed for reuse until Wait returns; runtime panics.