登录
首页 >  Golang >  Go问答

golang使用了waitGroup,仍然出现死锁错误

来源:stackoverflow

时间:2024-04-14 19:45:35 396浏览 收藏

大家好,今天本人给大家带来文章《golang使用了waitGroup,仍然出现死锁错误》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我正在尝试按照 go concurrency 书实现桥接模式

func bridge_impl() {
    done := make(chan interface{})
    defer close(done)
    var wg sync.WaitGroup
    bridge := func(
        done <-chan interface{},
        chanStream <-chan <-chan interface{},
    ) <-chan interface{} {
        valStream := make(chan interface{})
        go func() {
            wg.Add(1)
            defer close(valStream)
            for {
                var stream <-chan interface{}
                select {
                case maybeStream, ok := <-chanStream:
                    fmt.Println("works")
                    if ok == false {
                        return
                    }
                    stream = maybeStream
                case <-done:
                    return
                }
                for val := range stream {
                    select {
                    case valStream <- val:
                    case <-done:
                    }
                }
            }
        }()
        return valStream
    }
    genVals := func() <-chan <-chan interface{} {
        chanStream := make(chan (<-chan interface{}))
        go func() {
            wg.Add(1)
            defer close(chanStream)
            for i := 0; i < 10; i++ {
                stream := make(chan interface{})
                stream <- i
                close(stream)
                chanStream <- stream
            }
        }()
        return chanStream
    }
    for v := range bridge(done, genVals()) {
        fmt.Printf("%v ", v)
    }
    wg.Wait()
}

但是我收到了一个死锁错误all goroutine are sleep - deadlock!起初我认为我应该添加一个等待组,即使它没有在书本示例中实现,但我最终遇到了相同的错误


正确答案


据我了解,您根本不需要 waitgroup,您只需要重新排序 genvals 函数循环中的语句即可:

for i := 0; i < 10; i++ {
    stream := make(chan interface{})
    chanstream <- stream
    stream <- i
    close(stream)
}

https://go.dev/play/p/7D9OzrsvZyi

主要有两个问题。
Working example

第一期

for i := 0; i < 10; i++ {
    stream := make(chan interface{})
    stream <- i
    close(stream)
    chanstream <- stream
}

创建后写入无缓冲通道,没有 goroutine 读取。使用缓冲通道或其他 goroutine。

stream := make(chan interface{}, 1) // buffer size 1 to not block `stream <- i`

第二期
使用 wg.add(1) 而不使用 wg.done()
在这两种情况下您都可以使用 defer

wg.Add(1)
defer wg.Done()

以上就是《golang使用了waitGroup,仍然出现死锁错误》的详细内容,更多关于的资料请关注golang学习网公众号!

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