猿问

golang中通道缓冲容量为0和1的区别

我已将通道缓冲区大小设置为零,例如var intChannelZero = make(chan int),当从中获取值时intChannelZero将被阻塞,直到intChannelZero具有值。

此外,我将通道缓冲区大小设置为 1,例如var intChannelOne = make(chan int, 1),当从 获取值时intChannelOne将被阻塞,直到intChannelOne具有值。

我们知道的容量intChannelZero是零,容量intChannelOne是一,所以我想知道:

  • intChannelZero给like赋值时intChannelZero <- 1,值保存在哪里?

  • 为它们赋值时intChannelZero以及赋值时的差异。intChannelOne

谁能在Golang Runtime Enviroment 层面解释一下?多谢。


DIEA
浏览 190回答 2
2回答

心有法竹

如果通道是无缓冲的(容量为零),则只有当发送方和接收方都准备就绪时,通信才会成功。如果通道已缓冲(容量 >= 1),则如果通道未满则发送成功且不会阻塞,如果缓冲区不为空则接收成功且不会阻塞。当像 intChannelZero <- 1 那样将值赋给 intChannelZero 时,该值保存在哪里?该值从发送方复制到接收方。除了实现可能使用的任何临时变量外,该值不会保存在任何地方。intChannelZero 和 intChannelOne 赋值时的区别。在 intChannelZero 块上发送,直到接收器准备就绪。发送 intChannelOne 块,直到缓冲区中有可用空间。

拉丁的传说

无缓冲和缓冲通道的区别在于,发送到频道被阻止从通道接收被阻止对于无缓冲通道如果频道已经发送消息但尚未收到,则发送将被阻止。如果从未发生过发送,则接收将被阻止。对于缓冲通道如果已经发生 n(channel size) 次发送并且没有收到任何发送,则发送将被阻止。即整个通道大小已被发送的消息使用,但没有收到任何消息。如果缓冲区为空,即没有任何未使用的发送,则接收将被阻止运行时错误接收阻塞将抛出波纹管错误fatal&nbsp;error:&nbsp;all&nbsp;goroutines&nbsp;are&nbsp;asleep&nbsp;-&nbsp;deadlock! goroutine&nbsp;1&nbsp;[chan&nbsp;receive]:发送被阻止将抛出波纹管错误fatal&nbsp;error:&nbsp;all&nbsp;goroutines&nbsp;are&nbsp;asleep&nbsp;-&nbsp;deadlock! goroutine&nbsp;1&nbsp;[chan&nbsp;send]:
随时随地看视频慕课网APP

相关分类

Go
我要回答