登录
首页 >  Golang >  Go问答

超出缓冲区限制

来源:stackoverflow

时间:2024-03-16 09:39:30 381浏览 收藏

在 Go 语言中,当向缓冲通道发送数据时,如果超出通道容量,会导致程序阻塞。然而,在本文中,由于主 Goroutine 在匿名 Goroutine 阻塞时退出,因此不会发生死锁。尽管 Go 的竞争检测工具无法检测到此问题,但匿名 Goroutine 的阻塞仍可能导致其他并发问题,例如延迟或资源泄漏。为了避免这些问题,建议仔细管理通道容量并使用适当的同步机制来协调 Goroutine 之间的通信。

问题内容

覆盖缓冲通道超过其容量有什么影响吗?

由于还有另一个 go 例程,并且主 go 例程不与其连接,因此这里不会出现死锁

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
        //}

        
    }

正确答案


因此这里没有死锁

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

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

即使匿名 Goroutine 在 ch <- 4 上被阻塞,所有程序也会停止。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《超出缓冲区限制》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>