wg.add(20)就没有问题,如果放到for里面wg.add(1)就会报错
来源:11-2 使用Channel等待任务结束

qq_Qian儭_03543846
2021-07-05
老师好,这个例子中wg.add(20)就没有问题,如果放到for里面wg.add(1)就会报错,奇怪
wg.Add(20)
//往通道发送数据
for i, worker := range workers {
//fmt.Printf(“往通道 <%d> 写数据…\n”, j)
worker.in <- ‘a’ + i
}
for i, worker := range workers {
//fmt.Printf(“往通道 <%d> 写数据…\n”, j)
worker.in <- ‘B’ + i
}
报错:
Worker 0 receiverd a
Worker 0 receiverd B
Worker 1 receiverd b
Worker 2 receiverd c
Worker 3 receiverd d
Worker 6 receiverd g
Worker 5 receiverd f
Worker 7 receiverd h
Worker 8 receiverd i
Worker 9 receiverd j
Worker 4 receiverd e
panic: sync: negative WaitGroup counter
goroutine 10 [running]:
sync.(*WaitGroup).Add(0xc00000a0a0, 0xffffffffffffffff)
G:/Go/src/sync/waitgroup.go:74 +0x147
sync.(*WaitGroup).Done(…)
G:/Go/src/sync/waitgroup.go:99
main.doWorker(0x4, 0xc00003e1e0, 0xc00000a0a0)
F:/mukegit/learngo/gorouting/d2/使用channel等待任务结束.go:41 +0x114
created by main.createWorker
F:/mukegit/learngo/gorouting/d2/使用channel等待任务结束.go:55 +0x85
2回答
-
需要每次循环时先Add(1),再给worker发送数据
012021-07-05 -
熊猫拍板砖
2021-07-09
往两个for 里 各放一个 wg.Add(1)
00
相似问题