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回答

ccmouse

2021-07-05

需要每次循环时先Add(1),再给worker发送数据

0
1
qq_Qian儭_03543846
非常感谢!
2021-07-05
共1条回复

熊猫拍板砖

2021-07-09

往两个for 里 各放一个 wg.Add(1)

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程