为了账号安全,请及时绑定邮箱和手机立即绑定

有一个缓存位置的通道,在被接收数据之前也是阻塞的吗?

package main


import (

    "fmt"

)

func main() {

    ch := make(chan int 1)

       go func() {

        fmt.Println("1")

        ch <- 1

    }()

    <-ch

    go func() {

       fmt.Println("2")

        ch <- 1

    }()

    <-ch

    go func() {

        fmt.Println("3")

        ch <- 1

    }()

    <-ch

}

把上面的1个缓存通道去掉,改成非缓存通道,程序还是可以执行的。请问有一个缓存位置的通道,在被接收数据之前也是和非缓存通道一样,是阻塞的吗?

正在回答

1 回答

这里的‘在被接受数据之前’指的是ch<-1存数据吧。

缓冲的channel:保证往缓冲中存数据先于对应的取数据,简单说就是在取的时候里面肯定有数据,否则就因取不到而阻塞。所以缓冲的channel可能在取数据的时候发生阻塞。

非缓冲的channel:保证取数据先于存数据,就是保证存的时候肯定有其他的goroutine在取,否则就因放不进去而阻塞。所以非缓冲的channel可能在存数据的时候会发生阻塞。


2 回复 有任何疑惑可以回复我~
#1

qq_慕圣411555 提问者

谢谢谢谢
2019-04-20 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

有一个缓存位置的通道,在被接收数据之前也是阻塞的吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信