将数据发送到通道片中的通道时出现死锁

将数据发送到通道片中的整数通道会导致死锁


该代码预计将创建 5 个 (+1 ) 个通道。这些通道用于发送整数值,并在中接收相同的值,最后将它们扇入到 。fanInChansend()receive()fanInChan


验证码:-


package main


import (

    "fmt"

    "sync"

)


func main() {

    defer fmt.Println("About to exit!")

    fmt.Println("Started")


    channels := make([]chan int, 5)

    fanInChan := make(chan int)


    go send(channels)

    go recive(fanInChan, channels)


    for val := range fanInChan {

        fmt.Println("Fanin", val)

    }

}

func send(channels []chan int) {

    defer fmt.Println("Send Ended")

    fmt.Println("Send Started")


    for i := 0; i < 100; i++ {

        channels[i%5] <- i

    }


    for i := 0; i < 5; i++ {

        close(channels[i])

    }

}


func recive(fanin chan<- int, channels []chan int) {

    defer fmt.Println("Recive Ended")

    fmt.Println("Recive Started")


    var wg sync.WaitGroup

    wg.Add(5)


    for i := 0; i < 5; i++ {

        go func(inew int) {

            defer wg.Done()

            fmt.Println(inew)

            for v := range channels[inew] {

                fanin <- v

            }

        }(i)

    }


    wg.Wait()

    close(fanin)

}


戈朗游乐场


输出:-


Started

Send Started

Recive Started

4

1

2

3

0

fatal error: all goroutines are asleep - deadlock!

... //You can see rest on playground link above

问题开始于 for 内部的循环send()


for i := 0; i < 100; i++ {

        channels[i%5] <- i

    }


qq_笑_17
浏览 187回答 1
1回答

墨色风雨

该语句正在分配一个具有 nil 通道的数组,该通道channels := make([]chan int, 5)从通道接收的块<- channel块发送到通道channel <- value关闭时的恐慌close(channel)因此,您必须单独初始化每个通道以接收整数值。在使用数组中的通道之前,应先初始化这些通道。channels&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;range&nbsp;channels&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channels[i]&nbsp;=&nbsp;make(chan&nbsp;int) &nbsp;&nbsp;&nbsp;&nbsp;}在行之前插入此内容并运行。go send(channels)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go