登录
首页 >  Golang >  Go问答

遇到死锁的情况下通过通道查找数组中的最大值

来源:stackoverflow

时间:2024-03-01 10:36:18 465浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《遇到死锁的情况下通过通道查找数组中的最大值》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在创建一个带有 go 例程和通道的函数,它可以接受任何大小的数组,例如 {100,122, 14, 64, ...} ,它会找到数组之间的较高扣除值最后一个位置和前一个位置等等。因此,例如 64 大于 14,则必须扣除它,您将得到更高的值,但不会扣除比当前值更高的值。 目前我面临僵局,不知道如何解决

func maximumValue(b ...int){
    maxValue := make(chan int)
    maxInteger := 0

    for i := len(b)-1; i >0 ;i--{
        go getHigher(b, b[i],maxValue)
    }

    for n := range maxValue {
        if n > maxInteger{
            maxInteger = n
        }
    }

    fmt.Println(maxInteger)
}

func getHigher(b []int, x int, maxValue chan<- int) {
    higherValue := 0
    for _, v:=range b{
        if x>v && higherValue < x-v {
            higherValue = x-v
        }
    }
    maxValue <- higherValue
}

解决方案


通道上的 for 循环将在该通道打开时继续读取该通道。由于您的程序不会关闭通道,因此一旦写入通道的所有 goroutine 终止,它就会死锁。

为您的 goroutine 使用 sync.waitgroup,并在所有 goroutine 完成后关闭通道:

var wg sync.WaitGroup
for i := len(b)-1; i >0 ;i--{
        wg.Add(1)
        go getHigher(b, b[i],maxValue,&wg)
}
go func() {
  wg.Wait()
  close(maxValue)
}()

for n := range maxValue {
   if n > maxInteger{
       maxInteger = n
  }
}

func getHigher(b []int, x int, maxValue chan<- int,wg *sync.WaitGroup) {
   defer wg.Done()
   ...
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>