首页 > go语言中chan的死锁问题。

go语言中chan的死锁问题。

package main

import "fmt"

func main() {
    out := make(chan int)
    out <- 2

    fmt.Println(<-out)
}

上面的代码一运行就有错
fatal error:all goroutines are asleep-deadlock

如果将chan的初始化改为

out:=make(chan int, 1)就可以。

为什么?


无缓冲的channel,如题主的代码。
当在向一个无缓冲的channel发送数据时,代码会阻塞直到有另一个goroutine接收这个channel。
楼上的解释很形象,就像你打电话,你拨过去就等着人接,那边没人接你就一直等,所以阻塞了。
所以改进方法就是,先开启一个goroutine去电话那头等着接电话,然后你再拨号,这样两边就通了,然后故事继续

func haha(ch chan int) {
    num := <-ch
    fmt.Println(num)
}

func main() {
    ch := make(chan int)
    ch <- 2
    //.....
}

我的理解是,chan不同于变量
变量是你可以先放进去,再取出来。
但是chan在是一个通信工具,如果没人取,你就放不进去。
比如电话,没人接你就打不通。但是比如微信你就可以先录进去对方以后再听。


因为默认无缓冲的channel是阻塞的,在
out <- 2
这一句会阻塞等待其它goroutine从out读取
然而并没有其他goroutine

【热门文章】
【热门文章】