Go 的 Buffered Channel 的阻塞机制

问题描述 投票:0回答:2

Tour of Go中,给出了示例代码:

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

它执行得很好并且打印出来了

1
2

此行为与本练习的描述不同,其中指出:

仅当缓冲区已满时才发送到缓冲通道块。当缓冲区为空时接收块

ch <- 2
行之后,
ch 
已满,并且由于我们只运行1个单独的goroutine,即主goroutine,因此该goroutine应该被阻塞,直到
ch 
被接收者消耗,因此代码不应该到达
fmt.Println(<-ch)
线,但应该说类似

致命错误:所有 goroutine 都在休眠 - 死锁!

然而,事实并非如此,我很困惑,并寻求指导。

go channel
2个回答
0
投票

通道可容纳两人。两次发送可以成功而不会阻塞。 第三一个不能。仅当通道在发送之前已满时,发送才会阻塞。


0
投票

ch

是一个容量为2的通道。它最多可以容纳2个值,当你尝试放入第3个值时,它会阻塞。该示例仅输入 2 个值。

© www.soinside.com 2019 - 2024. All rights reserved.