Макс элемент - фатальная ошибка: все программы спят - тупик - PullRequest
0 голосов
/ 07 апреля 2020

На моей машине 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 на четыре потока ОС? найти максимальный элемент

1 Ответ

2 голосов
/ 07 апреля 2020

U нужно вызвать wg.Done () в горутинах Например:

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