Thanks, everyone, for your answers! I think I understand what sync.WaitGroup is doing now.
Jon On Friday, April 27, 2018 at 7:29:50 AM UTC-4, rog wrote: > > On 26 April 2018 at 16:29, Jon Bodner <j...@bodnerfamily.com <javascript:>> > wrote: > > Hello, > > > > We were having a discussion at work about passing around references to > > sync.WaitGroup. I said it was a bad idea, because if a goroutine > launched a > > goroutine of its own and called sync.WaitGroup.Add() after a goroutine > > called sync.WaitGroup.Wait(), but before the count dropped to 0, your > code > > would panic. The comments seem to support this: > > > > "If a WaitGroup is reused to wait for several independent sets of > events, > > new Add calls must happen after all previous Wait calls have returned." > > > > And the WaitGroup source code for Add has lines like this: > > > > if w != 0 && delta > 0 && v == int32(delta) { > > panic("sync: WaitGroup misuse: Add called concurrently with Wait") > > } > > > > But a co-worker wrote this code, and it runs without a panic: > > https://play.golang.org/p/NjqK_YoqHeH > > FWIW This code is fine, and was part of the original design goal of > WaitGroup. When the count is known to be non-zero (for example because > the current goroutine has previously done an Add) it's OK to call Add > to add more. > > The key in the above quote is "If a WaitGroup is reused to wait for > several independent sets of events". If you're reusing a WaitGroup, > this makes sense, but in the example above, the WaitGroup is not > reused so all is good. > > As for the panic, others have already explained how that might happen. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.