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

来源:8-4 go语句初探

qq_慕圣411555

2019-04-07 12:40

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回答

  • 记忆浅谈
    2019-04-08 16:09:19
    已采纳

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

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

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


    qq_慕圣4...

    谢谢谢谢

    2019-04-20 14:39:42

    共 1 条回复 >

Go语言第一课

Go语言入门教程,编程之必备知识扩散,打好Go语言编程基础

107795 学习 · 148 问题

查看课程

相似问题