为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
DIEA 2023-05-08 16:31:11
我已将通道缓冲区大小设置为零,例如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 块,直到缓冲区中有可用空间。


查看完整回答
反对 回复 2023-05-08
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

无缓冲和缓冲通道的区别在于,

  1. 发送到频道被阻止

  2. 从通道接收被阻止

对于无缓冲通道

如果频道已经发送消息但尚未收到,则发送将被阻止。

如果从未发生过发送,则接收将被阻止。

对于缓冲通道

如果已经发生 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]:


查看完整回答
反对 回复 2023-05-08
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信