【问题标题】:Max element - fatal error: all goroutines are asleep - deadlock最大元素 - 致命错误:所有 goroutine 都处于睡眠状态 - 死锁
【发布时间】:2020-04-07 12:34:37
【问题描述】:

在我的机器上runtime.NUMCPU 是 4

以下代码:

package main

import (
    "fmt"
    "sync"

    "github.com/myhub/a/expressions"
)

var list = make([]int, 1e5)

func main() {

    value := 0
    for i := 0; i < 1e5; i++ {
        list[i] = value // sample list
        value = value + 1
    }
    var wg sync.WaitGroup
    wg.Add(1)
    var max1 int
    go func() {
        max1 = expressions.Max(list[0 : 1e5/4-1])
    }()
    wg.Add(1)
    var max2 int
    go func() {
        max2 = expressions.Max(list[1e5/4 : 1e5/2-1])
    }()
    wg.Add(1)
    var max3 int
    go func() {
        max3 = expressions.Max(list[1e5/2 : 3*1e5/4-1])
    }()
    wg.Add(1)
    var max4 int
    go func() {
        max4 = expressions.Max(list[3*1e5/4 : 1e5-1])
    }()

    wg.Wait()
    fmt.Println(max1, max2, max3, max4)

}

package expressions

func Max(list []int) int {

    length := len(list)
    if length > 1 {

        if list[0] > list[length-1] {

            return Max(list[:length-1])
        } else {

            return Max(list[1:length])
        }
    }
    return list[0]
}

给出错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc00001a0a8)
        /usr/local/go/src/runtime/sema.go:56 +0x42
sync.(*WaitGroup).Wait(0xc00001a0a0)
        /usr/local/go/src/sync/waitgroup.go:130 +0x64
main.main()
        /home/machine1/code/src/github.com/myhub/a/Main.go:41 +0x1b5
exit status 2

对于具有未排序数据的长度make([]int, 1e5) 的列表,

如何将list 的负载分配给四个操作系统线程?找到最大元素

【问题讨论】:

标签: multithreading go synchronization deadlock goroutine


【解决方案1】:

你需要在 gorutines 中调用 wg.Done() 例如:

wg.Add(1)
var max4 int
go func() {
    max4 = expressions.Max(list[3*1e5/4 : 1e5-1])
    wg.Done()
}()

【讨论】:

  • 这是 go 例程的顺序处理。不是吗?
  • 不,因为 wg.Wait() 在函数的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2016-07-30
  • 2014-04-22
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
相关资源
最近更新 更多