求助求助 有关channel 单向通道(旧)和 无缓冲通道一直写入没有发生阻塞(新) 的问题

a1al · · 858 次点击
改成这样,你才能让他阻塞,2个协程去抢同一把锁才会阻塞,你只有一个协程拿锁,不会阻塞的。 ``` go c := make(chan int) mutex := sync.Mutex{} go func(out chan<- int) { fmt.Println("product func") defer close(c) mutex.Lock() //加锁保证对通道的占用 for i:=0 ; i<= 5;i++{ out <- i } mutex.Unlock() fmt.Println("product func end") }(c) go func(in <-chan int ) { mutex.Lock() //加锁保证对通道的占用 fmt.Println("consumer function") for num := range in{ fmt.Println(num) } mutex.Unlock() fmt.Println("consumer function end") }(c) //把双向channel传入 单向channel作为参数的函数 中 time.Sleep(5*time.Second) ``` 这样你程序就只会打印 ``` product func consumer function ``` 然后5秒自己退出
#6
更多评论
主线程挂了之后,程序会直接退出,你启动的两个协程还没来得及运行,程序已经退出了。在最后面加个sleep 或者用sync.WaitGroup
#1
非缓冲通道,还加锁保证通道占用,先不谈运行结果:D
#2