簡體   English   中英

Go功能通道中的死鎖

[英]Deadlock in go function channel

為什么即使我只傳遞一個並從通道中獲得一個輸出,也會出現死鎖?

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)

}

對於那些閱讀此問題並可能想知道他的代碼為什么失敗的人,這里有一個解釋。

當他像這樣構建自己的渠道片段時:

tmp_val := make([]chan float64,numberOfSlices)

他制作了通道切片,其中每個索引都指向通道零值。 通道零值是nil,因為通道是參考類型,並且nil通道在發送時永遠阻塞,並且由於nil通道中從不存在任何內容,所以它永遠會阻塞。 這樣就會陷入僵局。

當footy更改其代碼以使用以下命令分別構造每個通道時

tmp_val[i] = make(chan float64)

他循環構造了非零通道,一切都很好。

我在做陳時是錯的。 應該已經完成

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM