Golang 中国

初学golang,有很多不明白的地方,这个问题有点低级,还请原谅。。。。

func main() {
    c := make(chan int)
    c <- 1
    x := <-c
    fmt.Println(x)
}

这个程序在build的时候会报错:

fatal error: all goroutines are asleep - deadlock!

默认情况下,channel接收和发送数据都是阻塞的,直到数据被读出,变量x已经读出了c的数据,但是为什么 还会出现死锁? 怎么理解阿??


liuzxc 于 2014-11-06 17:19 修改
8 回复
dxhdxh2k
#1 dxhdxh2k • 2014-11-06 19:52

c := make(chan int,1)

shaovie
#2 shaovie • 2014-11-07 12:23
lishe302
#3 lishe302 • 2014-11-12 18:31

无缓冲的channel,在主routine写入后,需要在其他routine读取,再写个函数

    func readch(ch chan){ 
     <- ch
    }
David
#4 David • 2014-11-13 23:32

c <- 1这句就block住了,还没来得及读呢。

jiafeicat
#5 jiafeicat • 2017-09-05 16:40

@lishe302 对于unbuffered channel ,主goroutine已经阻塞,再其他函数或goroutine中也是无济于事。只能通过在主goroutine中开启一个新的goroutine进行写入然后再进行相应的操作。

改进方式1:

ch := make(chan int,1)
ch <- 100
fmt.Println(<-ch)

改进方式2:

ch := make(chan int)
go func(){
    ch <- 100
}()
fmt.Println(<-ch)
xicheng1000
#6 xicheng1000 • 2017-09-10 17:39

学习了

grenaaron
#7 grenaaron • 2017-09-19 07:54

要么使用有缓存的隧道,要么给隧道喂数据用协程,都是为了避免隧道堵塞,学习了。

yanjinbin
#8 yanjinbin • 2017-09-21 20:46

channel 相当于 有界或者无界的阻塞队列 java 并发编程实战学过的 大概都能懂 GO 的 channel 概念

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。