dooso0594
2019-06-24 20:07
浏览 211
已采纳

使用for循环遍历通道时获取Goroutine死锁

I am tring to practise goroutine and channels, where I am facing issue where I am calling gorouting and passing channel. The goroutine will push data into into channel and then main thread will print the elements.

I have used for loop to print the contents but getting.

fatal error: all goroutines are asleep - deadlock!

2
1
goroutine 1 [chan receive]:
main.main()
package main

import "fmt"


func smallThread(a int, c chan int) {
    c <- a
}

func main() {
    c := make(chan int)
    go smallThread(1, c)
    go smallThread(2, c)
    for {
        fmt.Println(<-c)
    }
}

EDIT: Using waitgroup:

func smallThread(a int, c chan int, w *sync.WaitGroup) {
    c <- a
    w.Done()
}

func main() {
    c := make(chan int)
    var w sync.WaitGroup
    w.Add(2)
    go smallThread(1, c, &w)
    go smallThread(2, c, &w)
    //w.Wait()
    for i := range c {
        fmt.Println(i)
    }
    w.Wait()
}

EDIT2: Working Code

func smallThread(a int, c chan int, w *sync.WaitGroup) {
    //defer w.Done()
    c <- a
    w.Done()
}

func main() {
    c := make(chan int)
    var w sync.WaitGroup
    w.Add(1)
    go smallThread(1, c, &w)
    w.Add(1)
    go smallThread(2, c, &w)
    go func(c chan int) {
        for i := range c {
            fmt.Println(i)
        }
    }(c)
    w.Wait()
}
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongxifu5009 2019-06-24 20:38
    已采纳

    When the goroutines are done, close the channel to indicate that no more values will be added. The for loop will break when after all values are received.

    c := make(chan int)
    var w sync.WaitGroup
    w.Add(2)
    go smallThread(1, c, &w)
    go smallThread(2, c, &w)
    go func() {
        w.Wait()
        close(c)
    }()
    
    for i := range c {
        fmt.Println(i)
    }
    
    已采纳该答案
    打赏 评论
  • douxiong3245 2019-06-24 20:19

    Not sure what your question is, but I'll tell you what happens. Your two side goroutines push their numbers to the channel and exit. Then the main goroutine (the only one left at this point) will block forever, waiting for another element to come out of the channel.

    打赏 评论

相关推荐 更多相似问题