美文网首页
Go 失误导致 Goroutine 死锁

Go 失误导致 Goroutine 死锁

作者: ProgrammingGuy | 来源:发表于2020-02-08 22:19 被阅读0次
    package main
    
    import (
        "fmt"
    )
    
    func fibonacci(c chan int) {
        x, y := 0, 1
        for {
            c <- x
            x, y = y, x+y
        }
    }
    
    func main() {
        c := make(chan int)
        go func() {
            for i := 0; i < 10; i++ {
                fmt.Println(<-c)
            }
        }()
        fibonacci(c)
    }
    

    之前的代码是这样,但是每次运行都发生死锁。


    image.png

    之后发现Fibonacci是一个死循环,如果main中间的goroutine不再需要c中的数据,
    Fibonacci就会一直产生数据,直到channel溢出,所以需要给Fibonacci一个停止条件。

    package main
    
    import (
        "fmt"
    )
    
    func fibonacci(c chan int, q chan bool) {
        x, y := 0, 1
        for {
            select {
            case c <- x:
                x, y = y, x+y
            case <-q:
                fmt.Println("quit")
                return
            }
        }
    }
    
    func main() {
        c := make(chan int)
        q := make(chan bool)
        go func() {
            for i := 0; i < 10; i++ {
                fmt.Println(<-c)
            }
            q <- true
        }()
        fibonacci(c, q)
    }
    
    image.png

    相关文章

      网友评论

          本文标题:Go 失误导致 Goroutine 死锁

          本文链接:https://www.haomeiwen.com/subject/hwewxhtx.html