Go 失误导致 Goroutine 死锁

2020-02-08  本文已影响0人  ProgrammingGuy
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
上一篇 下一篇

猜你喜欢

热点阅读