使用长度为零的缓冲通道

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 不起作用

计算给定总和为零的所有连续子数组

rust sort

Go语言的并发(多线程协程)通道(信道)缓冲信道(Buffer Channels)长度和容量

979. 三角形的最大周长

976. 三角形的最大周长