使用长度为零的缓冲通道
Posted
技术标签:
【中文标题】使用长度为零的缓冲通道【英文标题】:Use of Buffered Channels of Length Zero 【发布时间】:2019-06-05 10:55:56 【问题描述】:我想知道为什么语言中存在长度为零的缓冲通道。根据我的经验,它们似乎只会产生僵局。到底有没有用?
【问题讨论】:
无缓冲通道允许通过交换一个值来同步两个 goroutine。 实际上,在 Go 中编程时的经验法则是,如果让通道缓冲解决了问题,那么您就有了逻辑错误。缓冲通道确实有用途(实际上是两种用途),但大多数时候您应该开始使用无缓冲通道。 “长度为零的缓冲通道”不存在。如果它的长度为零,则根据定义,它是无缓冲的。 【参考方案1】:大小为零的通道是无缓冲的。这意味着每次发送都会阻塞,直到另一个 goroutine 从通道接收。这个例子可以工作:
package main
import (
"fmt"
"time"
)
func main()
ch := make(chan int, 0)
go func()
for c := range ch
fmt.Println(c)
()
ch <- 1
ch <- 2
time.Sleep(time.Minute)
【讨论】:
【参考方案2】:来自this answer(强调我的):
默认情况下,通道的缓冲区大小为 0(您可以通过
make(chan int)
获得此值)。这意味着每次发送都会阻塞,直到另一个 goroutine 从通道接收到。
如果您收到死锁,则很可能是通道没有读取任何内容,或者某些内容的写入速度超过了您的读取速度。
【讨论】:
以上是关于使用长度为零的缓冲通道的主要内容,如果未能解决你的问题,请参考以下文章
着色器存储缓冲区对象的长度为零,glMapBufferRange 不起作用