致命错误:所有goroutine都在睡着-死锁! goroutine 1 [semacquire]:

时间:2020-09-07 14:21:56

标签: go

我正在运行goroutine,它的通道仍然出现错误


package main

import (
    "fmt"
    "sync"
    "time"
)

func foo(c chan int, wg *sync.WaitGroup) {
    c <- 45
    time.Sleep(time.Second * 4)
    c <- 122
    wg.Done()

}

func main() {
    canal := make(chan int)
    var wg sync.WaitGroup

    wg.Add(2)
    go foo(canal,&wg)
    go foo(canal,&wg)
    wg.Wait()

    for a := range canal {
        fmt.Println(a)
    }

}

1 个答案:

答案 0 :(得分:1)

make(chan int)创建一个unbuffered channel。这意味着所有发送和接收运算符都将等到另一侧准备就绪。

在goroutine中调用c <- 45的那一刻,该goroutine将等待,直到有人从频道接收到。但是直到range canal停留在wg.Wait()的{​​{1}}语句之前,没有消费者存在。

因此,您的两个goroutine停留在发送到通道上,而main正在等待goroutine完成后再从通道使用。

您可以在单独的goroutine中消耗通道中的元素(在wg.Wait()之前),也可以创建一个缓冲通道(例如:make(chan int, 10)