package main
import (
"fmt"
)
func f1(in chan int) {
fmt.Println(<-in)
}
func main() {
out := make(chan int)
out <- 2
go f1(out)
}
为什么这样会造成死锁?怎么解决?
package main
import (
"fmt"
)
func f1(in chan int) {
fmt.Println(<-in)
}
func main() {
out := make(chan int)
out <- 2
go f1(out)
}
为什么这样会造成死锁?怎么解决?
out
队列无缓冲,主线程会阻塞在这里。解决方法有两个。
第一,设置缓冲:
package main
import (
"fmt"
)
func f1(in chan int) {
fmt.Println(<-in)
}
func main() {
out := make(chan int,1)
out <- 2
go f1(out)
}
第二,将go f1(out)
提前:
package main
import (
"fmt"
)
func f1(in chan int) {
fmt.Println(<-in)
}
func main() {
out := make(chan int)
go f1(out)
out <- 2
}
需要明白2个概念,无缓冲通道和有缓存通道。
ch := make(chan int)
和 ch := make(chan int, 0)
创建的都是无缓冲通道。ch := make(chan int, x)
,其中x>0,建立的是有缓存通道。两者的区别是,无缓冲通道是同步的,写入数据时,必须有协程把数据读走才返回,有缓存通道是半异步的,当缓冲还没有用满时,写入数据时,只要缓存还有空余空间,写入到缓冲就可以返回。
题主这里是无缓冲通道,向out写数据时,协程f1还没有创建,也就无协程读out的数据,造成程序死锁。
5 回答5.5k 阅读✓ 已解决
6 回答2.7k 阅读
2 回答3.2k 阅读✓ 已解决
1 回答5.3k 阅读✓ 已解决
2 回答3.1k 阅读✓ 已解决
1 回答5.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
改成这样:
因为你make是不带缓冲的chan
所以chan需要有人消费才能写入,不然会阻塞
因此还有第二种方法,生成带缓冲的chan: