美文网首页
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