首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >go函数通道死锁

go函数通道死锁
EN

Stack Overflow用户
提问于 2013-05-17 06:11:46
回答 2查看 95关注 0票数 0

为什么会有一个死锁,即使我只是传递了一个,并从通道获得一个输出?

代码语言:javascript
复制
package main

import "fmt"
import "math/cmplx"

func max(a []complex128, base int, ans chan float64,  index chan int) {

    fmt.Printf("called for %d,%d\n",len(a),base)

    maxi_i := 0
    maxi := cmplx.Abs(a[maxi_i]);

    for i:=1 ; i< len(a) ; i++ {
        if cmplx.Abs(a[i]) > maxi {
            maxi_i = i
            maxi = cmplx.Abs(a[i])
        }
    }

    fmt.Printf("called for %d,%d and found %f %d\n",len(a),base,maxi,base+maxi_i)

    ans <- maxi
    index <- base+maxi_i
}

func main() {
    ans := make([]complex128,128)

    numberOfSlices := 4
    incr := len(ans)/numberOfSlices
    tmp_val := make([]chan float64,numberOfSlices)
    tmp_index := make([]chan int,numberOfSlices)
    for i,j := 0 , 0; i < len(ans); j++{
        fmt.Printf("From %d to %d - %d\n",i,i+incr,len(ans))
        go max(ans[i:i+incr],i,tmp_val[j],tmp_index[j])

        i = i+ incr
    }
//After Here is it stops deadlock
    maximumFreq := <- tmp_index[0]
    maximumMax := <- tmp_val[0]
    for i := 1; i < numberOfSlices; i++ {

        tmpI := <- tmp_index[i]
        tmpV := <- tmp_val[i]

        if(tmpV > maximumMax ) {
            maximumMax = tmpV
            maximumFreq = tmpI
        }
    }

    fmt.Printf("Max freq = %d",maximumFreq)

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 10:22:56

对于那些阅读这个问题的人,也许想知道为什么他的代码失败了,这里有一个解释。

当他像这样构建他的通道切片时:

代码语言:javascript
复制
tmp_val := make([]chan float64,numberOfSlices)

他对通道进行切片,其中每个索引都是通道的零值。通道零值为nil,因为通道是引用类型,并且nil通道永远阻塞发送,并且由于nil通道中从来没有任何东西,因此它也将永远阻塞在接收时。因此,你会得到一个死锁。

当footy更改他的代码以单独构造每个通道时

代码语言:javascript
复制
tmp_val[i] = make(chan float64)

在一个循环中,他构造了非零通道,一切都很好。

票数 2
EN

Stack Overflow用户

发布于 2013-05-17 07:09:29

我做错了陈可辛的事。你应该做的

代码语言:javascript
复制
numberOfSlices := 4
incr := len(ans)/numberOfSlices
var tmp_val [4]chan float64
var tmp_index [4]chan int

for i := range tmp_val {
    tmp_val[i] = make(chan float64)
    tmp_index[i] = make(chan int)
}

for i,j := 0 , 0; i < len(ans); j++{
    fmt.Printf("From %d to %d [j:%d] - %d\n",i,i+incr,j,len(ans))
    go maximumFunc(ans[i:i+incr],i,tmp_val[j],tmp_index[j])

    i = i+ incr
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16598353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档