diff --git a/base/channel/example/main.go b/base/channel/example/main.go index 19959cc..02cf637 100644 --- a/base/channel/example/main.go +++ b/base/channel/example/main.go @@ -3,13 +3,12 @@ package main import ( "fmt" "sync" + "sync/atomic" ) var wg = new(sync.WaitGroup) -var once = new(sync.Once) -//consumerNum := int32 -//var consumer = atomic.N +var consumer = int32(0) func f1(ch chan int) { defer wg.Done() @@ -27,17 +26,22 @@ func f2(in chan int, out chan int) { out <- i * i } - once.Do(func() { + if atomic.AddInt32(&consumer, -1) <= 0 { // 使用完必须 close 不然将导致死锁 close(out) - }) + } } func main() { ch := make(chan int, 20) ch2 := make(chan int, 5) - wg.Add(2) + + wg.Add(1) go f1(ch) + + wg.Add(2) + atomic.AddInt32(&consumer, 2) + go f2(ch, ch2) go f2(ch, ch2) for i := range ch2 {