登录
首页 >  Golang >  Go问答

for循环遍历通道时如何避免Goroutine死锁

来源:stackoverflow

时间:2024-02-25 11:30:29 415浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《for循环遍历通道时如何避免Goroutine死锁》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我正在尝试练习 goroutine 和通道,但我遇到了调用 gorouting 和传递通道的问题。 goroutine 将数据推送到 channel,然后主线程将打印元素。

我已经使用for循环来打印内容但是得到了。

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

编辑: 使用等待组:

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:工作代码

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()
}

解决方案


当 goroutine 完成后,关闭通道以指示不再添加任何值。当接收到所有值后,for 循环将中断。

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

不确定您的问题是什么,但我会告诉您会发生什么。你的两侧 goroutine 将它们的数字推送到通道并退出。然后主 goroutine(此时只剩下唯一的一个)将永远阻塞,等待另一个元素从通道中出来。

今天关于《for循环遍历通道时如何避免Goroutine死锁》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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