猿问

make(chan bool) 与 make(chan bool, 1) 的行为有何不同?

我的问题来自于尝试读取频道(如果可以)或编写(如果可以)使用select语句。


我知道指定的通道make(chan bool, 1)是缓冲的,我的部分问题是它之间的区别是什么,并且make(chan bool)-此页面所说的与make(chan bool, 0)- 可以容纳 0 值的通道的意义是什么它?


见操场A:


chanFoo := make(chan bool)


for i := 0; i < 5; i++ {

    select {

    case <-chanFoo:

        fmt.Println("Read")

    case chanFoo <- true:

        fmt.Println("Write")

    default:

        fmt.Println("Neither")

    }

}

一个输出:


Neither

Neither

Neither

Neither

Neither

(删除default案例会导致死锁!!)


现在看到操场 B:


chanFoo := make(chan bool, 1)   // the only difference is the buffer size of 1


for i := 0; i < 5; i++ {

    select {

    case <-chanFoo:

        fmt.Println("Read")

    case chanFoo <- true:

        fmt.Println("Write")

    default:

        fmt.Println("Neither")

    }

}

B输出:


Write

Read

Write

Read

Write

就我而言,B 输出是我想要的。无缓冲通道有什么好处?我在 golang.org 上看到的所有示例似乎都使用它们一次发送一个信号/值(这是我所需要的)——但就像在操场 A 中一样,通道永远不会被读取或写入。我对频道的理解在这里缺少什么?


吃鸡游戏
浏览 412回答 3
3回答

慕森卡

可以容纳 0 个值的通道的要点是什么首先我想指出,这里的第二个参数表示缓冲区大小,所以它只是一个没有缓冲区的通道(无缓冲通道)。其实这就是你的问题产生的原因。无缓冲通道仅在有人阻止读取时才可写,这意味着您将有一些协程可以使用——而不是单个协程。另请参阅Go 内存模型:来自无缓冲通道的接收发生在该通道上的发送完成之前。

慕桂英546537

无缓冲通道意味着从通道读取和向通道写入是阻塞的。在一份select声明中:如果其他 goroutine 当前被阻止写入通道,则读取将起作用如果其他 goroutine 当前在读取通道时被阻塞,则写入将起作用否则将default执行案例,这在您的案例 A 中发生。
随时随地看视频慕课网APP

相关分类

Go
我要回答