将wg.Add(20)改成在两个for中的wg.Add(1)出现的BUG
来源:11-2 使用Channel等待任务结束
残天一月
2018-04-02
package main
import (
"fmt"
"sync"
)
func doWork(id int,
w worker) {
for n := range w.in {
fmt.Printf("Worker %d received %c\n",
id, n)
w.done()
}
}
type worker struct {
in chan int
done func()
}
func createWorker(
id int, wg *sync.WaitGroup) worker {
w := worker{
in: make(chan int),
done: func() {
wg.Done()
},
}
go doWork(id, w)
return w
}
func chanDemo() {
var wg sync.WaitGroup
var workers [10]worker
for i := 0; i < 10; i++ {
workers[i] = createWorker(i, &wg)
}
//wg.Add(20)
for i, worker := range workers {
worker.in <- 'a' + i
wg.Add(1)
}
for i, worker := range workers {
worker.in <- 'A' + i
wg.Add(1)
}
wg.Wait()
}
func main() {
chanDemo()
}老师您好 代码如上 按照您说的 可以将wg.Add(20)改成wg.Add(1) 但这样一来的话 worker中的goroutine执行时可能会碰到wg计数已经为0了 然后再wg.Done的时候会变成负数、结果就会报 "sync: negative WaitGroup counter"的panic、想问一下老师 这里应该怎么去解决啊
写回答
1回答
-
需要先加1,再分发任务(^ω^)
112018-04-03
相似问题