我已将通道缓冲区大小设置为零,例如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 层面解释一下?多谢。
2 回答
心有法竹
TA贡献1866条经验 获得超5个赞
如果通道是无缓冲的(容量为零),则只有当发送方和接收方都准备就绪时,通信才会成功。
如果通道已缓冲(容量 >= 1),则如果通道未满则发送成功且不会阻塞,如果缓冲区不为空则接收成功且不会阻塞。
当像 intChannelZero <- 1 那样将值赋给 intChannelZero 时,该值保存在哪里?
该值从发送方复制到接收方。除了实现可能使用的任何临时变量外,该值不会保存在任何地方。
intChannelZero 和 intChannelOne 赋值时的区别。
在 intChannelZero 块上发送,直到接收器准备就绪。
发送 intChannelOne 块,直到缓冲区中有可用空间。
拉丁的传说
TA贡献1789条经验 获得超8个赞
无缓冲和缓冲通道的区别在于,
发送到频道被阻止
从通道接收被阻止
对于无缓冲通道
如果频道已经发送消息但尚未收到,则发送将被阻止。
如果从未发生过发送,则接收将被阻止。
对于缓冲通道
如果已经发生 n(channel size) 次发送并且没有收到任何发送,则发送将被阻止。即整个通道大小已被发送的消息使用,但没有收到任何消息。
如果缓冲区为空,即没有任何未使用的发送,则接收将被阻止
运行时错误
接收阻塞将抛出波纹管错误
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]:
发送被阻止将抛出波纹管错误
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]:
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消