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

ccmouse

2018-04-02

需要先加1,再分发任务(^ω^)

1
1
残天一月
非常感谢!
2018-04-03
共1条回复

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

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

5995 学习 · 1909 问题

查看课程