【问题标题】:writing to buffer channel more than its capacity写入缓冲区通道超过其容量
【发布时间】:2021-11-23 21:58:35
【问题描述】:

覆盖缓冲区通道超过其容量是否有任何影响?

由于还有另一个 goroutine 并且 main goroutine 没有加入它,所以这里没有死锁

    package main
    
    import "fmt"
    
    func main() {
        ch := make(chan int, 2)
        go func (){
        ch <- 1
        ch <- 2
        ch <- 4//blocks here but scheduler picked up another go routine
        ch <- 6
        ch <- 10
        //close(ch)
        }()
        fmt.Println(<-ch)
        fmt.Println(<-ch)
        //for v:=range ch{
        //fmt.Println(<-ch)//1 2 4 6 10
        //}

        
    }

【问题讨论】:

  • 您不能向缓冲通道发送超过其容量的值,进一步的发送被阻止,直到从通道接收到值,为新值腾出空间。这种情况是完全正常的,不会有什么不好的事情发生。
  • @icza 谢谢你的澄清,但如果没有空间接收进一步的发送值将导致阻塞

标签: go concurrency channels


【解决方案1】:

因为这里没有死锁

go build -race . 确实不会检测到竞争条件。

但是没有死锁的主要原因是主函数在第二个fmt.Println(&lt;-ch)之后退出。

即使匿名 goroutine 在 ch &lt;- 4 上被阻止,所有程序仍然会停止。

【讨论】:

  • 是的,感谢您指出是否有等待组加入两个 go 例程然后创建死锁条件让主 go 例程等待另一个 go 例程完成,这是代码 play.golang.org/p/L1xJJp_uHPN
猜你喜欢
  • 2021-12-11
  • 2012-02-04
  • 2020-11-11
  • 1970-01-01
  • 2015-07-31
  • 2017-10-15
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多