将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
相似问题