docs: channel 生产者/消费者

This commit is contained in:
Shikong 2021-11-11 12:00:18 +08:00
parent a954d9400c
commit c2e965e3c7

View File

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