为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_笑_17 2022-09-26 14:14:13
将数据发送到通道片中的整数通道会导致死锁该代码预计将创建 5 个 (+1 ) 个通道。这些通道用于发送整数值,并在中接收相同的值,最后将它们扇入到 。fanInChansend()receive()fanInChan验证码:-package mainimport (    "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)}戈朗游乐场输出:-StartedSend StartedRecive Started41230fatal 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    }
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

该语句正在分配一个具有 nil 通道的数组,该通道channels := make([]chan int, 5)

  • 从通道接收的块<- channel

  • 块发送到通道channel <- value

  • 关闭时的恐慌close(channel)

因此,您必须单独初始化每个通道以接收整数值。

在使用数组中的通道之前,应先初始化这些通道。channels

    for i := range channels {
        channels[i] = make(chan int)
    }

在行之前插入此内容并运行。go send(channels)


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号